From 9d52a2d0493764f864b80f96bf14e1f90635fa7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulysse=20G=C3=A9rard?= Date: Sat, 20 Dec 2025 14:36:47 +0100 Subject: [PATCH] Merge remote-tracking branch 'origin/master' into 414-LTS-upgrade --- .github/workflows/build-and-test.yml | 7 +- .gitignore | 3 +- CHANGES.md | 21 + Makefile | 11 +- README.md | 33 +- biome.json | 23 + dune-project | 7 +- flake.nix | 6 +- jsonrpc.opam | 3 +- jsonrpc/src/dune | 1 + jsonrpc/src/import.ml | 13 +- jsonrpc/src/jsonrpc.mli | 13 +- lsp-fiber/src/import.ml | 6 +- lsp/bin/cinaps.ml | 16 +- lsp/bin/dune | 4 +- lsp/bin/import.ml | 90 +- lsp/bin/metamodel/metamodel.ml | 10 +- lsp/bin/ocaml/json_gen.ml | 2 +- lsp/bin/ocaml/ml.ml | 2 +- lsp/bin/ocaml/ocaml.ml | 26 +- lsp/bin/typescript/ts_types.ml | 65 +- lsp/bin/typescript/ts_types.mli | 16 +- lsp/bin/typescript/typescript.ml | 2 +- ocaml-lsp-server.opam | 4 +- ocaml-lsp-server/bin/main.ml | 15 +- ocaml-lsp-server/docs/ocamllsp/config.md | 61 +- ocaml-lsp-server/docs/ocamllsp/locate-spec.md | 39 + ocaml-lsp-server/docs/ocamllsp/phrase-spec.md | 31 + .../docs/ocamllsp/typeExpression-spec.md | 31 + ocaml-lsp-server/src/code_actions.ml | 12 +- ocaml-lsp-server/src/config_data.ml | 30 +- .../src/custom_requests/custom_request.ml | 3 + .../src/custom_requests/custom_request.mli | 3 + .../src/custom_requests/req_locate.ml | 79 + .../src/custom_requests/req_locate.mli | 22 + .../src/custom_requests/req_phrase.ml | 80 + .../src/custom_requests/req_phrase.mli | 20 + .../custom_requests/req_type_expression.ml | 72 + .../custom_requests/req_type_expression.mli | 20 + ocaml-lsp-server/src/definition_query.ml | 6 +- ocaml-lsp-server/src/definition_query.mli | 1 + ocaml-lsp-server/src/document.ml | 24 +- ocaml-lsp-server/src/document.mli | 1 + ocaml-lsp-server/src/dune.ml | 5 +- ocaml-lsp-server/src/hover_req.ml | 6 +- ocaml-lsp-server/src/import.ml | 56 +- ocaml-lsp-server/src/inference.ml | 7 +- ocaml-lsp-server/src/merlin_config.ml | 6 +- ocaml-lsp-server/src/merlin_config.mli | 2 +- ocaml-lsp-server/src/ocaml_lsp_server.ml | 68 +- ocaml-lsp-server/src/ocaml_lsp_server.mli | 2 +- ocaml-lsp-server/src/ocamlformat.ml | 4 + ocaml-lsp-server/src/ocamlformat.mli | 3 +- ocaml-lsp-server/src/semantic_highlighting.ml | 3 +- ocaml-lsp-server/src/workspace_symbol.ml | 48 +- ocaml-lsp-server/test/e2e-new/code_lens.ml | 104 + .../test/e2e-new/document_symbol.ml | 23 +- ocaml-lsp-server/test/e2e-new/dune | 5 + ocaml-lsp-server/test/e2e-new/hover.ml | 43 + ocaml-lsp-server/test/e2e-new/inlay_hints.ml | 2 +- ocaml-lsp-server/test/e2e-new/locate.ml | 105 + .../test/e2e-new/merlin_call_compatible.ml | 3 +- ocaml-lsp-server/test/e2e-new/phrase.ml | 126 ++ ocaml-lsp-server/test/e2e-new/start_stop.ml | 5 +- .../test/e2e-new/type_expression.ml | 74 + ocaml-lsp-server/test/e2e-new/type_search.ml | 6 +- ocaml-lsp-server/test/e2e/.gitignore | 1 - ocaml-lsp-server/test/e2e/.prettierignore | 1 - ocaml-lsp-server/test/e2e/.prettierrc | 6 - .../test/e2e/__tests__/Lifecycle.test.ts | 11 +- .../test/e2e/__tests__/Request.Debug.test.ts | 6 +- .../test/e2e/__tests__/TextDocument.test.ts | 8 +- .../__tests__/completionItem-resolve.test.ts | 45 +- .../e2e/__tests__/ocamllsp-hoverExtended.ts | 479 ++-- .../test/e2e/__tests__/ocamllsp-inferIntf.ts | 5 +- .../e2e/__tests__/ocamllsp-switchImplIntf.ts | 59 +- .../test/e2e/__tests__/ocamllsp-typedHoles.ts | 102 +- .../ocamllsp-wrappingAstNode.test.ts | 128 +- .../__tests__/textDocument-codeAction.test.ts | 1011 ++++----- .../__tests__/textDocument-codeLens.test.ts | 42 +- .../textDocument-declaration.test.ts | 30 +- .../__tests__/textDocument-definition.test.ts | 8 +- .../e2e/__tests__/textDocument-diagnostics.ts | 626 +++--- .../textDocument-documentHighlight.test.ts | 30 +- .../__tests__/textDocument-documentSymbol.ts | 416 ++-- .../textDocument-foldingRange.test.ts | 1962 ++++++++--------- .../__tests__/textDocument-formatting.test.ts | 50 +- .../e2e/__tests__/textDocument-hover.test.ts | 139 +- .../__tests__/textDocument-references.test.ts | 30 +- .../e2e/__tests__/textDocument-rename.test.ts | 230 +- .../textDocument-selectionRange.test.ts | 392 ++-- .../__tests__/textDocument-signatureHelp.ts | 148 +- .../textDocument-typeDefinition.test.ts | 42 +- .../e2e/__tests__/workspace-symbol.test.ts | 220 +- ocaml-lsp-server/test/e2e/jest.config.js | 7 +- ocaml-lsp-server/test/e2e/package.json | 20 +- .../test/e2e/src/LanguageServer.ts | 41 +- ocaml-lsp-server/test/e2e/src/Ocamlformat.js | 10 +- ocaml-lsp-server/test/e2e/src/Refmt.js | 10 +- package.json | 11 + .../test/e2e/yarn.lock => yarn.lock | 1948 ++++++++-------- 101 files changed, 5531 insertions(+), 4383 deletions(-) create mode 100644 biome.json create mode 100644 ocaml-lsp-server/docs/ocamllsp/locate-spec.md create mode 100644 ocaml-lsp-server/docs/ocamllsp/phrase-spec.md create mode 100644 ocaml-lsp-server/docs/ocamllsp/typeExpression-spec.md create mode 100644 ocaml-lsp-server/src/custom_requests/req_locate.ml create mode 100644 ocaml-lsp-server/src/custom_requests/req_locate.mli create mode 100644 ocaml-lsp-server/src/custom_requests/req_phrase.ml create mode 100644 ocaml-lsp-server/src/custom_requests/req_phrase.mli create mode 100644 ocaml-lsp-server/src/custom_requests/req_type_expression.ml create mode 100644 ocaml-lsp-server/src/custom_requests/req_type_expression.mli create mode 100644 ocaml-lsp-server/test/e2e-new/code_lens.ml create mode 100644 ocaml-lsp-server/test/e2e-new/hover.ml create mode 100644 ocaml-lsp-server/test/e2e-new/locate.ml create mode 100644 ocaml-lsp-server/test/e2e-new/phrase.ml create mode 100644 ocaml-lsp-server/test/e2e-new/type_expression.ml delete mode 100644 ocaml-lsp-server/test/e2e/.gitignore delete mode 100644 ocaml-lsp-server/test/e2e/.prettierignore delete mode 100644 ocaml-lsp-server/test/e2e/.prettierrc create mode 100644 package.json rename ocaml-lsp-server/test/e2e/yarn.lock => yarn.lock (54%) diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 7a5384e75..8d29e98ad 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -42,8 +42,7 @@ jobs: node-version: lts/* - name: Install npm packages - run: yarn --frozen-lockfile - working-directory: ocaml-lsp-server/test/e2e + run: yarn install --frozen-lockfile - name: Set-up OCaml uses: ocaml/setup-ocaml@v3 @@ -93,6 +92,10 @@ jobs: git config --global user.name github-actions[bot] git config --global user.email github-actions[bot]@users.noreply.github.com + # Remove this pin once a compatible version of Merlin has been released + - name: Pin dev Merlin + run: opam --cli=2.1 pin --with-version=5.6-504 https://github.com/voodoos/merlin.git#main + - name: Install dependencies run: | opam install . --deps-only diff --git a/.gitignore b/.gitignore index 2a337320c..7f9361008 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,9 @@ -_opam/ _build/ +_opam/ .idea/ .log/ .vscode/ +node_modules/ tmp/ .DS_Store .merlin diff --git a/CHANGES.md b/CHANGES.md index ae11470dd..aff87738b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,23 @@ +# 1.25.0 + +## Features + +- Make `code-lens` for nested let bindings configurable (#1567) +- Add support for `.mlx` files, including formatting via `ocamlformat-mlx` and most OCaml LSP features (diagnostics, code actions, hover, etc.) (#1528) +- Add `typeExpression` custom request (#1576) +- Add `locate` custom request (#1576) +- Add `phrase` custom request (#1576) + +## Fixes + +- Improve precision of collected metrics timestamps. (#1565) +- Fallback on `.merlin` configuration if no `dune-project` file is found and if + `dot-merlin-reader` is installed. (#1563, fixes #1522) + +- Fix hover on method calls not showing the type. (#1553, fixes #1552) +- Fix error on opening `.mll` files (#1557) +- Ensure compatibility with both yojson 2.0 and 3.0. (#1534) + # 1.21.0 ## Features @@ -42,6 +62,7 @@ [`ocamllsp/typeSearch`](/ocaml-lsp-server/docs/ocamllsp/typeSearch-spec.md) request (#1369) - Make MerlinJump code action configurable (#1376) +- Add support for OCaml 5.3 (#1386) - Add custom [`ocamllsp/jump`](/ocaml-lsp-server/docs/ocamllsp/merlinJump-spec.md) request (#1374) diff --git a/Makefile b/Makefile index 11ea0d90e..9ad517867 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ TEST_E2E_DIR = ocaml-lsp-server/test/e2e .PHONY: yarn-install yarn-install: - cd $(TEST_E2E_DIR) && yarn --frozen-lockfile + yarn install --frozen-lockfile -include Makefile.dev @@ -39,7 +39,6 @@ lock: ## Generate the lock files bench: ## dune exec ocaml-lsp-server/bench/ocaml_lsp_bench.exe --profile bench - .PHONY: test-ocaml test-ocaml: ## Run the unit tests dune build @lsp/test/runtest @lsp-fiber/runtest @jsonrpc-fiber/runtest @ocaml-lsp-server/runtest @@ -70,7 +69,6 @@ clean: ## Clean build artifacts and other generated files .PHONY: fmt fmt: ## Format the codebase with ocamlformat dune build @fmt --auto-promote - cd $(TEST_E2E_DIR) .PHONY: watch watch: ## Watch for the filesystem and rebuild on every change @@ -89,15 +87,12 @@ release: ## Release on Opam dune-release opam submit .PHONY: nix-tests -nix-tests: - (cd $(TEST_E2E_DIR) && yarn --frozen-lockfile) +nix-tests: yarn-install make test .PHONY: nix-fmt -nix-fmt: - $(MAKE) yarn-install +nix-fmt: yarn-install dune build @fmt --auto-promote - cd $(TEST_E2E_DIR) .PHONY: coverage-deps coverage-deps: diff --git a/README.md b/README.md index d653aa8c4..7dc48f987 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,33 @@ To add the language server to an esy project, run in terminal: $ esy add @opam/ocaml-lsp-server ``` +#### Dune + +If you are using [Dune for package +management](https://dune.readthedocs.io/en/stable/explanation/package-management.html) +on the [latest nightly build](https://preview.dune.build/) or version 3.21 or +later, you can install `ocamllsp` locally within the current project by +running: +```sh +$ dune tools install ocamllsp +``` + +This will compile `ocamllsp` with the same OCaml compiler as the project itself - +a requirement for `ocamllsp` to be able to analyze the code in the project. + +To make sure your editor sees the correct instance of `ocamllsp` for the +project, run `eval $(dune tools env)` from your shell before launching your +editor from the same shell. This can be automated by adding `eval $(dune tools +env)` to a `.envrc` file in the project's root directory and using +[direnv](https://direnv.net). Editors that aren't launched from the terminal +require plugin support to locate the appropriate `ocamllsp` executable +installed by Dune. For VSCode use the [OCaml +Platform](https://marketplace.visualstudio.com/items?itemName=ocamllabs.ocaml-platform) +plugin, and for Emacs use the +[ocaml-eglot](https://github.com/tarides/ocaml-eglot) package and follow +[these](https://github.com/tarides/ocaml-eglot?tab=readme-ov-file#usage-with-dune-pkg) +instructions. + ### Installing from sources This project uses submodules to handle dependencies. This is done so that users @@ -415,9 +442,3 @@ date. Also, both servers seem deprecated. use merlin which means that it supports fewer versions of OCaml and offers less "smart" functionality - especially in the face of sources that do not yet compile. - -- [ocaml-language-server](https://github.com/ocaml-lsp/ocaml-language-server) - This project is extremely similar in the functionality it provides because it - also reuses merlin on the backend. The essential difference is that this - project is written in typescript, while our server is in OCaml. We feel that - it's best to use OCaml to maximize the contributor pool. diff --git a/biome.json b/biome.json new file mode 100644 index 000000000..2bc4e24c7 --- /dev/null +++ b/biome.json @@ -0,0 +1,23 @@ +{ + "$schema": "node_modules/@biomejs/biome/configuration_schema.json", + "formatter": { + "enabled": true, + "ignore": ["lsp/bin/metamodel/metaModel.json", "package.json"], + "useEditorconfig": true + }, + "linter": { + "enabled": true, + "ignore": ["ocaml-lsp-server/test/e2e/**"], + "rules": { + "recommended": true + } + }, + "organizeImports": { + "enabled": true + }, + "vcs": { + "clientKind": "git", + "enabled": true, + "useIgnoreFile": true + } +} diff --git a/dune-project b/dune-project index 6a22c0439..6ef165292 100644 --- a/dune-project +++ b/dune-project @@ -45,7 +45,7 @@ possible and does not make any assumptions about IO. (synopsis "LSP Server for OCaml") (description "An LSP server for OCaml.") (depends - (yojson (< 3.0.0)) + yojson (base (>= v0.16.0)) (lsp (= :version)) (jsonrpc (= :version)) @@ -63,7 +63,7 @@ possible and does not make any assumptions about IO. spawn astring camlp-streams - (ppx_expect (and (>= v0.15.0) (< 0.17.0) :with-test)) + (ppx_expect (and (>= v0.17.0) :with-test)) (ocamlformat (and :with-test (= 0.27.0))) (ocamlc-loc (>= 3.7.0)) (pp (>= 1.1.2)) @@ -75,8 +75,9 @@ possible and does not make any assumptions about IO. (package (name jsonrpc) - (synopsis "Jsonrpc protocol implemenation") + (synopsis "Jsonrpc protocol implementation") (description "See https://www.jsonrpc.org/specification") (depends + (yojson (>= 2.0)) (ocaml (>= 4.08)) (odoc :with-doc))) diff --git a/flake.nix b/flake.nix index 53888938a..9ca3c504d 100644 --- a/flake.nix +++ b/flake.nix @@ -11,7 +11,7 @@ outputs = { self, flake-utils, nixpkgs, ... }@inputs: let package = "ocaml-lsp-server"; - ocamlformat = pkgs: pkgs.ocamlformat_0_26_2; + ocamlformat = pkgs: pkgs.ocamlformat_0_27_0; basePackage = { duneVersion = "3"; version = "n/a"; @@ -31,7 +31,7 @@ fixPreBuild = o: { propagatedBuildInputs = o.propagatedBuildInputs ++ [ oself.pp ]; preBuild = '' - rm -r vendor/csexp vendor/pp + rm -rf vendor/csexp vendor/pp ''; }; in { @@ -48,7 +48,7 @@ }); }; ocamlVersionOverlay = - (ocaml: self: super: { ocamlPackages = ocaml super.ocaml-ng; }); + (ocaml: self: super: { ocamlPackages = super.ocaml-ng.${ocaml}; }); makeLocalPackages = pkgs: let buildDunePackage = pkgs.ocamlPackages.buildDunePackage; in rec { diff --git a/jsonrpc.opam b/jsonrpc.opam index a0c16048f..5835ca244 100644 --- a/jsonrpc.opam +++ b/jsonrpc.opam @@ -1,6 +1,6 @@ # This file is generated by dune, edit dune-project instead opam-version: "2.0" -synopsis: "Jsonrpc protocol implemenation" +synopsis: "Jsonrpc protocol implementation" description: "See https://www.jsonrpc.org/specification" maintainer: ["Rudi Grinberg "] authors: [ @@ -20,6 +20,7 @@ homepage: "https://github.com/ocaml/ocaml-lsp" bug-reports: "https://github.com/ocaml/ocaml-lsp/issues" depends: [ "dune" {>= "3.0"} + "yojson" {>= "2.0"} "ocaml" {>= "4.08"} "odoc" {with-doc} ] diff --git a/jsonrpc/src/dune b/jsonrpc/src/dune index 4d270c2dd..15f08b825 100644 --- a/jsonrpc/src/dune +++ b/jsonrpc/src/dune @@ -1,4 +1,5 @@ (library (public_name jsonrpc) + (libraries yojson) (instrumentation (backend bisect_ppx))) diff --git a/jsonrpc/src/import.ml b/jsonrpc/src/import.ml index 1f6bd09ee..4caaad9d5 100644 --- a/jsonrpc/src/import.ml +++ b/jsonrpc/src/import.ml @@ -9,18 +9,7 @@ module Option = struct end module Json = struct - type t = - [ `Assoc of (string * t) list - | `Bool of bool - | `Float of float - | `Int of int - | `Intlit of string - | `List of t list - | `Null - | `String of string - | `Tuple of t list - | `Variant of string * t option - ] + type t = Yojson.Safe.t exception Of_json of (string * t) diff --git a/jsonrpc/src/jsonrpc.mli b/jsonrpc/src/jsonrpc.mli index 9b8193772..49effa685 100644 --- a/jsonrpc/src/jsonrpc.mli +++ b/jsonrpc/src/jsonrpc.mli @@ -1,18 +1,7 @@ (** Jsonrpc implementation *) module Json : sig - type t = - [ `Assoc of (string * t) list - | `Bool of bool - | `Float of float - | `Int of int - | `Intlit of string - | `List of t list - | `Null - | `String of string - | `Tuple of t list - | `Variant of string * t option - ] + type t = Yojson.Safe.t (** Raised when conversions from json fail *) exception Of_json of (string * t) diff --git a/lsp-fiber/src/import.ml b/lsp-fiber/src/import.ml index da49c436b..11734fbed 100644 --- a/lsp-fiber/src/import.ml +++ b/lsp-fiber/src/import.ml @@ -64,11 +64,11 @@ module Json = struct | `Bool f -> Bool f | `Assoc o -> Record (List.map o ~f:(fun (k, v) -> k, to_dyn v)) | `List l -> List (List.map l ~f:to_dyn) - | `Tuple args -> Tuple (List.map args ~f:to_dyn) | `Null -> Dyn.Variant ("Null", []) - | `Variant (name, Some arg) -> Variant (name, [ to_dyn arg ]) - | `Variant (name, None) -> Variant (name, []) | `Intlit s -> String s + | _ -> Dyn.Variant ("Unsupported", []) + (* This last case is unused with Yojson >= 3 *) + [@@warning "-11"] ;; end diff --git a/lsp/bin/cinaps.ml b/lsp/bin/cinaps.ml index c07c121b5..ea9753d61 100644 --- a/lsp/bin/cinaps.ml +++ b/lsp/bin/cinaps.ml @@ -7,7 +7,7 @@ let preprocess_metamodel = method! or_ path (types : Metamodel.type_ list) = match List.filter_map types ~f:(function - | Literal (Record []) -> None + | Metamodel.Literal (Record []) -> None | _ as t -> Some (self#type_ path t)) with | [] -> assert false @@ -17,10 +17,13 @@ let preprocess_metamodel = | Top (Alias s) when s.name = "TextDocumentContentChangeEvent" -> let t = let union_fields l1 l2 ~f = - let of_map = - String.Map.of_list_map_exn ~f:(fun (x : Metamodel.property) -> x.name, x) + let of_map xs = + List.map xs ~f:(fun (x : Metamodel.property) -> x.name, x) + |> String.Map.of_list in - String.Map.merge (of_map l1) (of_map l2) ~f |> String.Map.values + String.Map.merge (of_map l1) (of_map l2) ~f + |> String.Map.bindings + |> List.map ~f:snd in union_fields f1 f2 ~f:(fun k t1 t2 -> if k = "text" @@ -81,8 +84,9 @@ let expand_superclasses db (m : Metamodel.t) = let structures = let uniquify_fields fields = List.fold_left fields ~init:String.Map.empty ~f:(fun acc (f : Metamodel.property) -> - String.Map.set acc f.name f) - |> String.Map.values + String.Map.add acc ~key:f.name ~data:f) + |> String.Map.bindings + |> List.map ~f:snd in let rec fields_of_type (t : Metamodel.type_) = match t with diff --git a/lsp/bin/dune b/lsp/bin/dune index 6c2b237e6..1284abbaf 100644 --- a/lsp/bin/dune +++ b/lsp/bin/dune @@ -3,7 +3,7 @@ (test (name test_metamodel) (modules test_metamodel) - (libraries stdune yojson lsp_gen) + (libraries yojson lsp_gen) (deps metamodel/metaModel.json) (action (run ./test_metamodel.exe %{deps}))) @@ -13,4 +13,4 @@ (instrumentation (backend bisect_ppx)) (modules :standard \ test_metamodel) - (libraries stdune dyn pp yojson)) + (libraries dyn pp yojson)) diff --git a/lsp/bin/import.ml b/lsp/bin/import.ml index c1b414f8f..a089bed0d 100644 --- a/lsp/bin/import.ml +++ b/lsp/bin/import.ml @@ -1,13 +1,79 @@ -include struct - open Stdune - module List = List - module Id = Id - module String = String - module Code_error = Code_error - module Comparable = Comparable - module Top_closure = Top_closure - module Poly = Poly - module Option = Option - - let sprintf = sprintf +let sprintf = Printf.sprintf + +module Option = struct + include Option + + let map t ~f = Option.map f t + + let value_exn = function + | None -> assert false + | Some s -> s + ;; +end + +module List = struct + include ListLabels + + type ('a, 'b) skip_or_either = + | Skip + | Left of 'a + | Right of 'b + + let rev_filter_partition_map = + let rec loop l accl accr ~f = + match l with + | [] -> accl, accr + | x :: l -> + (match f x with + | Skip -> loop l accl accr ~f + | Left y -> loop l (y :: accl) accr ~f + | Right y -> loop l accl (y :: accr) ~f) + in + fun l ~f -> loop l [] [] ~f + ;; + + let filter_partition_map l ~f = + let l, r = rev_filter_partition_map l ~f in + rev l, rev r + ;; +end + +module String = struct + include StringLabels + + let to_dyn = Dyn.string + + module Map = struct + include MoreLabels.Map.Make (String) + + let of_list_reducei xs ~f = + List.fold_left xs ~init:empty ~f:(fun map (k, v) -> + update map ~key:k ~f:(function + | None -> Some v + | Some v' -> Some (f k v v'))) + ;; + + let of_list xs = + List.fold_left xs ~init:empty ~f:(fun acc (key, data) -> add ~key ~data acc) + ;; + + let of_list_map_exn xs ~f = + List.fold_left xs ~init:empty ~f:(fun acc x -> + let key, data = f x in + add ~key ~data acc) + ;; + + let union_exn x y = union ~f:(fun _ _ _ -> assert false) x y + end +end + +module Code_error = struct + let raise name data = + invalid_arg (sprintf "%s %s" name (Dyn.to_string (Dyn.record data))) + ;; +end + +module Poly = struct + let equal = Stdlib.( = ) + let compare = Stdlib.compare end diff --git a/lsp/bin/metamodel/metamodel.ml b/lsp/bin/metamodel/metamodel.ml index 7164d35bc..0fd145b54 100644 --- a/lsp/bin/metamodel/metamodel.ml +++ b/lsp/bin/metamodel/metamodel.ml @@ -1,4 +1,4 @@ -open Stdune +open Import type doc = { since : string option @@ -113,7 +113,7 @@ let fields = function ;; let field ?default (name : string) p fields = - match List.assoc fields name with + match List.assoc_opt name fields with | Some f -> p f | None -> (match default with @@ -122,7 +122,7 @@ let field ?default (name : string) p fields = ;; let field_o name p fields = - match List.assoc fields name with + match List.assoc_opt name fields with | None -> None | Some f -> Some (p f) ;; @@ -137,7 +137,7 @@ let literal lit json = if not (Poly.equal json lit) then error "unexpected liter let enum variants json = match json with | `String s -> - (match List.assoc variants s with + (match List.assoc_opt s variants with | None -> error "not a valid enum value" json | Some v -> v) | _ -> error "not a valid enum value" json @@ -370,7 +370,7 @@ module Entity = struct String.Map.union_exn structures enumerations |> String.Map.union_exn typeAliases ;; - let find t x = String.Map.find_exn t x + let find t x = String.Map.find x t end end diff --git a/lsp/bin/ocaml/json_gen.ml b/lsp/bin/ocaml/json_gen.ml index 44af31da8..7f26ced93 100644 --- a/lsp/bin/ocaml/json_gen.ml +++ b/lsp/bin/ocaml/json_gen.ml @@ -34,7 +34,7 @@ let json_error_pat msg = ;; let is_json_constr (constr : Type.constr) = - List.mem [ "String"; "Int"; "Bool" ] constr.name ~equal:String.equal + List.mem ~set:[ "String"; "Int"; "Bool" ] constr.name ;; module Name = struct diff --git a/lsp/bin/ocaml/ml.ml b/lsp/bin/ocaml/ml.ml index 4973e02e2..7d76e8a9b 100644 --- a/lsp/bin/ocaml/ml.ml +++ b/lsp/bin/ocaml/ml.ml @@ -409,7 +409,7 @@ module Expr = struct let pp_constr f { tag; poly; args } = let tag = - let tag = String.capitalize tag in + let tag = String.capitalize_ascii tag in Pp.verbatim (if poly then "`" ^ tag else tag) in match args with diff --git a/lsp/bin/ocaml/ocaml.ml b/lsp/bin/ocaml/ocaml.ml index fe20955fc..1de47a9f4 100644 --- a/lsp/bin/ocaml/ocaml.ml +++ b/lsp/bin/ocaml/ocaml.ml @@ -79,9 +79,7 @@ module Expanded = struct | None -> init | Some data -> let new_record = { f with data } in - if List.mem ~equal:Poly.equal init new_record - then init - else new_record :: init) + if List.mem ~set:init new_record then init else new_record :: init) in super#field f ~init end @@ -274,18 +272,18 @@ module Entities = struct type t = (Ident.t * Resolved.t) list let find db e : _ Named.t = - match List.assoc db e with + match List.assoc_opt e db with | Some s -> s | None -> Code_error.raise "Entities.find: unable to find" [ "e", Ident.to_dyn e ] ;; let of_map map ts = - List.map ts ~f:(fun (r : Resolved.t) -> String.Map.find_exn map r.name, r) + List.map ts ~f:(fun (r : Resolved.t) -> String.Map.find r.name map, r) ;; let rev_find (db : t) (resolved : Resolved.t) : Ident.t = match - List.filter_map db ~f:(fun (id, r) -> + List.filter_map db ~f:(fun (id, (r : Resolved.t)) -> if r.name = resolved.name then Some id else None) with | [] -> Code_error.raise "rev_find: resolved not found" [] @@ -327,17 +325,17 @@ end = struct [ Prim.Null; String; Bool; Number; Object; List ] |> List.map ~f:(fun s -> Resolved.Ident s) in - fun set -> List.for_all constrs ~f:(fun e -> List.mem set e ~equal:Poly.equal) + fun set -> List.for_all constrs ~f:(List.mem ~set) ;; let id = Type.name "Jsonrpc.Id.t" let is_same_as_id = - let sort = List.sort ~compare:Poly.compare in + let sort = List.sort ~cmp:Poly.compare in let constrs = [ Prim.String; Number ] |> List.map ~f:(fun s -> Resolved.Ident s) |> sort in - fun cs -> List.equal ( = ) constrs (sort cs) + fun cs -> List.equal ~eq:( = ) constrs (sort cs) ;; (* Any type that includes null needs to be extracted to be converted to an @@ -522,7 +520,7 @@ end = struct ;; let poly_enum_conv (t : _ Named.t) = - if List.for_all t.data ~f:(fun (c : Ml.Type.constr) -> List.is_empty c.args) + if List.for_all t.data ~f:(fun (c : Ml.Type.constr) -> c.args = []) then (* This is equivalent to an enum *) List.map t.data ~f:(fun (c : Ml.Type.constr) -> c.name, Literal.String c.name) @@ -585,7 +583,7 @@ end = struct let literal_wrapper = match literal_wrapper with | None -> [] - | Some { field_name; literal_value } -> + | Some { Mapper.field_name; literal_value } -> Json_gen.make_literal_wrapper_conv ~field_name ~literal_value @@ -626,7 +624,7 @@ let resolve_typescript (ts : Unresolved.t list) = let db = Entities.of_map db ts in match let idents = new name_idents in - Ident.Top_closure.top_closure + Ident.top_closure ts ~key:(fun x -> Entities.rev_find db x) ~deps:(fun x -> idents#t x ~init:[] |> List.map ~f:(Entities.find db)) @@ -640,7 +638,7 @@ let resolve_typescript (ts : Unresolved.t list) = let of_resolved_typescript db (ts : Resolved.t list) = let simple_enums, everything_else = List.filter_partition_map ts ~f:(fun (t : Resolved.t) -> - if List.mem skipped_ts_decls t.name ~equal:String.equal + if List.mem ~set:skipped_ts_decls t.name then Skip else ( match t.data with @@ -650,7 +648,7 @@ let of_resolved_typescript db (ts : Resolved.t list) = let simple_enums = List.map simple_enums ~f:(fun (t : _ Named.t) -> (* "open" enums need an `Other constructor *) - let allow_other = List.mem ~equal:String.equal with_custom_values t.name in + let allow_other = List.mem ~set:with_custom_values t.name in let data = List.filter_map t.data ~f:(fun (constr, v) -> match (v : Ts_types.Enum.case) with diff --git a/lsp/bin/typescript/ts_types.ml b/lsp/bin/typescript/ts_types.ml index c454410ed..c6206f45c 100644 --- a/lsp/bin/typescript/ts_types.ml +++ b/lsp/bin/typescript/ts_types.ml @@ -262,7 +262,19 @@ module Unresolved = struct end module Ident = struct - module Id = Stdune.Id.Make () + module Id = struct + type t = int + + let counter = ref 0 + + let gen () = + incr counter; + !counter + ;; + + let compare = Int.compare + let to_dyn = Dyn.int + end module T = struct type t = @@ -282,9 +294,44 @@ module Ident = struct let make name = { name; id = Id.gen () } - module C = Comparable.Make (T) - module Set = C.Set - module Top_closure = Top_closure.Make (Set) (Stdune.Monad.Id) + module Keys = struct + include MoreLabels.Set.Make (T) + + let add x y = add y x + let mem x y = mem y x + end + + let top_closure ~key ~deps elements = + let rec loop res visited elt ~temporarily_marked = + let key = key elt in + if Keys.mem temporarily_marked key + then Error [ elt ] + else if not (Keys.mem visited key) + then ( + let visited = Keys.add visited key in + let temporarily_marked = Keys.add temporarily_marked key in + deps elt + |> iter_elts res visited ~temporarily_marked + |> function + | Error l -> Error (elt :: l) + | Ok (res, visited) -> + let res = elt :: res in + Ok (res, visited)) + else Ok (res, visited) + and iter_elts res visited elts ~temporarily_marked = + match elts with + | [] -> Ok (res, visited) + | elt :: elts -> + loop res visited elt ~temporarily_marked + |> (function + | Error _ as result -> result + | Ok (res, visited) -> iter_elts res visited elts ~temporarily_marked) + in + iter_elts [] Keys.empty elements ~temporarily_marked:Keys.empty + |> function + | Ok (res, _visited) -> Ok (List.rev res) + | Error elts -> Error elts + ;; end module Prim = struct @@ -345,15 +392,15 @@ let subst unresolved = method inside s = {} method resolve n = - match String.Map.find params n with + match String.Map.find_opt n params with | Some [] -> assert false | Some (x :: _) -> `Resolved x | None -> - if inside = Some n then `Self else `Unresolved (String.Map.find_exn unresolved n) + if inside = Some n then `Self else `Unresolved (String.Map.find n unresolved) method push x y = let params = - String.Map.update params x ~f:(function + String.Map.update params ~key:x ~f:(function | None -> Some [ y ] | Some [] -> assert false | Some (y' :: xs) -> if y = y' then Some xs else Some (y :: y' :: xs)) @@ -362,9 +409,9 @@ let subst unresolved = method pop x = let params = - String.Map.update params x ~f:(function + String.Map.update params ~key:x ~f:(function | None -> - ignore (String.Map.find_exn params x); + ignore (String.Map.find x params); None | Some [] -> assert false | Some (_ :: xs) -> Some xs) diff --git a/lsp/bin/typescript/ts_types.mli b/lsp/bin/typescript/ts_types.mli index aa33961b9..7f3f72904 100644 --- a/lsp/bin/typescript/ts_types.mli +++ b/lsp/bin/typescript/ts_types.mli @@ -86,7 +86,9 @@ module Unresolved : sig end module Ident : sig - module Id : Id.S + module Id : sig + type t + end type t = { id : Id.t @@ -96,13 +98,11 @@ module Ident : sig val to_dyn : t -> Dyn.t val make : string -> t - module Top_closure : sig - val top_closure - : key:('a -> t) - -> deps:('a -> 'a list) - -> 'a list - -> ('a list, 'a list) result - end + val top_closure + : key:('a -> t) + -> deps:('a -> 'a list) + -> 'a list + -> ('a list, 'a list) result end module Prim : sig diff --git a/lsp/bin/typescript/typescript.ml b/lsp/bin/typescript/typescript.ml index e755d14cd..84ed555fd 100644 --- a/lsp/bin/typescript/typescript.ml +++ b/lsp/bin/typescript/typescript.ml @@ -19,7 +19,7 @@ let name_table (defns : Unresolved.t list) = let resolve_all (defns : Unresolved.t list) = let names = name_table defns in - let defns = String.Map.values names |> List.map ~f:fst in + let defns = String.Map.bindings names |> List.map ~f:snd |> List.map ~f:fst in let names = String.Map.map ~f:snd names in Ts_types.resolve_all defns ~names, names ;; diff --git a/ocaml-lsp-server.opam b/ocaml-lsp-server.opam index 5f1a83a76..60e61e44b 100644 --- a/ocaml-lsp-server.opam +++ b/ocaml-lsp-server.opam @@ -20,7 +20,7 @@ homepage: "https://github.com/ocaml/ocaml-lsp" bug-reports: "https://github.com/ocaml/ocaml-lsp/issues" depends: [ "dune" {>= "3.0"} - "yojson" {< "3.0.0"} + "yojson" "base" {>= "v0.16.0"} "lsp" {= version} "jsonrpc" {= version} @@ -38,7 +38,7 @@ depends: [ "spawn" "astring" "camlp-streams" - "ppx_expect" {>= "v0.15.0" & < "0.17.0" & with-test} + "ppx_expect" {>= "v0.17.0" & with-test} "ocamlformat" {with-test & = "0.27.0"} "ocamlc-loc" {>= "3.7.0"} "pp" {>= "1.1.2"} diff --git a/ocaml-lsp-server/bin/main.ml b/ocaml-lsp-server/bin/main.ml index 6aef73d00..1be7332d9 100644 --- a/ocaml-lsp-server/bin/main.ml +++ b/ocaml-lsp-server/bin/main.ml @@ -4,20 +4,23 @@ module Cli = Lsp.Cli let () = Printexc.record_backtrace true; let version = ref false in - let read_dot_merlin = ref false in + let prefer_dot_merlin = ref false in let arg = Lsp.Cli.Arg.create () in let spec = [ "--version", Arg.Set version, "print version" ; ( "--fallback-read-dot-merlin" - , Arg.Set read_dot_merlin - , "read Merlin config from .merlin files. The `dot-merlin-reader` package must be \ - installed" ) + , Arg.Set prefer_dot_merlin + , "deprecated, same as --prefer-dot-merlin" ) + ; ( "--prefer-dot-merlin" + , Arg.Set prefer_dot_merlin + , "always read Merlin config from existing .merlin files. The `dot-merlin-reader` \ + package must be installed" ) ] @ Cli.Arg.spec arg in let usage = "ocamllsp [ --stdio | --socket PORT | --port PORT | --pipe PIPE ] [ \ - --clientProcessId pid ]" + --clientProcessId pid ] [ --prefer-dot-merlin ]" in Arg.parse spec (fun _ -> raise @@ Arg.Bad "anonymous arguments aren't allowed") usage; let channel = @@ -37,7 +40,7 @@ let () = let module Exn_with_backtrace = Stdune.Exn_with_backtrace in match Exn_with_backtrace.try_with - (Ocaml_lsp_server.run channel ~read_dot_merlin:!read_dot_merlin) + (Ocaml_lsp_server.run channel ~prefer_dot_merlin:!prefer_dot_merlin) with | Ok () -> () | Error exn -> diff --git a/ocaml-lsp-server/docs/ocamllsp/config.md b/ocaml-lsp-server/docs/ocamllsp/config.md index aea4ddfc3..da5afa71e 100644 --- a/ocaml-lsp-server/docs/ocamllsp/config.md +++ b/ocaml-lsp-server/docs/ocamllsp/config.md @@ -16,11 +16,27 @@ interface config { extendedHover: { enable : boolean } /** - * Enable/Disable CodeLens - * @default false - * @since 1.16 + * Enable/Disable Standard Hover + * @default true + * @since 1.21 */ - codelens: { enable : boolean } + standardHover: { enable : boolean } + + codelens: { + /** + * Enable/Disable CodeLens + * @default false + * @since 1.16 + */ + enable : boolean, + + /** + * Enable CodeLens for nested let bindings + * @default false + * @since 1.25 + */ + forNestedBindings : boolean + } /** * Enable/Disable Dune diagnostics @@ -29,12 +45,28 @@ interface config { */ duneDiagnostics: { enable : boolean } - /** - * Enable/Disable Inlay Hints - * @default false - * @since 1.18 - */ - inlayHints: { enable : boolean } + inlayHints: { + /** + * Enable/Disable Inlay Hints for pattern variables + * @default false + * @since 1.23 + */ + hintPatternVariables : boolean + + /** + * Enable/Disable Inlay Hints for let bindings + * @default false + * @since 1.23 + */ + hintLetBindings : boolean + + /** + * Enable/Disable Inlay Hints for function params + * @default false + * @since 1.23 + */ + hintFunctionParams : boolean + } /** * Enable/Disable Syntax Documentation @@ -45,9 +77,16 @@ interface config { /** * Enable/Disable Merlin Jump code actions - * @default true + * @default false * @since 1.19 */ merlinJumpCodeActions: { enable : boolean } + + /** + * Enable/Disable Shorten Merlin Diagnostics + * @default false + * @since 1.23 + */ + shortenMerlinDiagnostics: { enable : boolean } } ``` diff --git a/ocaml-lsp-server/docs/ocamllsp/locate-spec.md b/ocaml-lsp-server/docs/ocamllsp/locate-spec.md new file mode 100644 index 000000000..b1a53ef58 --- /dev/null +++ b/ocaml-lsp-server/docs/ocamllsp/locate-spec.md @@ -0,0 +1,39 @@ +# Locate Request + +## Description + +The LSP protocol natively allows searching for definitions and +declarations; however, Merlin's `locate` command allows passing a +prefix to search for identifiers, hence the presence of this custom +request to offer more control in certain contexts. + +## Client Capability + +There is no client capability relative to this request. + +## Server capability + +- propert name: `handleLocate` +- property type: `boolean` + +## Request + +- method: `ocamllsp/locate` +- params: + + ```json + { + "uri": TextDocumentIdentifier, + "position": Position, + "kind": <"definition" | "declaration" | "type-definition">, + "prefix?": string + } + ``` +## Response + +```json +[ + { "range": Range, + "uri": DocumentIdentifier } +] +``` diff --git a/ocaml-lsp-server/docs/ocamllsp/phrase-spec.md b/ocaml-lsp-server/docs/ocamllsp/phrase-spec.md new file mode 100644 index 000000000..7fed03730 --- /dev/null +++ b/ocaml-lsp-server/docs/ocamllsp/phrase-spec.md @@ -0,0 +1,31 @@ +# Phrase Request + +## Description + +This custom request returns the position of the next or previous +phrase (top-level definition or module definition). + +## Client Capability + +There is no client capability relative to this request. + +## Server capability + +- propert name: `handlePhrase` +- property type: `boolean` + +## Request + +- method: `ocamllsp/phrase` +- params: + + ```json + { + "uri": TextDocumentIdentifier, + "position": Position, + "target": <"next" | "prev">, + } + ``` +## Response + +- result: `Position | null` diff --git a/ocaml-lsp-server/docs/ocamllsp/typeExpression-spec.md b/ocaml-lsp-server/docs/ocamllsp/typeExpression-spec.md new file mode 100644 index 000000000..4a4af8b90 --- /dev/null +++ b/ocaml-lsp-server/docs/ocamllsp/typeExpression-spec.md @@ -0,0 +1,31 @@ +# Type Expression Request + +## Description + +Returns the type of a given expression as a string. + +## Client capability + +There is no client capability relative to this request. + +## Server capability + +- property name: `handleTypeExpression` +- property type: `boolean` + +## Request + +- method: `ocamllsp/typeExpression` +- params: + + ```json + { + "uri": TextDocumentIdentifier, + "position": Position, + "expression": string, + } + ``` + +## Response + +- result: `string | null` diff --git a/ocaml-lsp-server/src/code_actions.ml b/ocaml-lsp-server/src/code_actions.ml index 662599eea..3c2eb2f21 100644 --- a/ocaml-lsp-server/src/code_actions.ml +++ b/ocaml-lsp-server/src/code_actions.ml @@ -54,12 +54,10 @@ let compute_ocaml_code_actions (params : CodeActionParams.t) state doc = ] in let batchable, non_batchable = - List.partition_map - ~f:(fun ca -> - match ca.run with - | `Batchable f -> Left f - | `Non_batchable f -> Right f) - enabled_actions + List.partition_map enabled_actions ~f:(fun ca -> + match ca.run with + | `Batchable f -> Base.Either.First f + | `Non_batchable f -> Second f) in let* batch_results = if List.is_empty batchable @@ -125,7 +123,7 @@ let compute server (params : CodeActionParams.t) = (match Document.syntax doc with | Ocamllex | Menhir | Cram | Dune -> Fiber.return (Reply.now (actions (dune_actions @ open_related)), state) - | Ocaml | Reason -> + | Ocaml | Reason | Mlx -> let reply () = let+ code_action_results = compute_ocaml_code_actions params state doc in List.concat [ code_action_results; dune_actions; open_related; merlin_jumps ] diff --git a/ocaml-lsp-server/src/config_data.ml b/ocaml-lsp-server/src/config_data.ml index 3fe22ce36..d4badf072 100644 --- a/ocaml-lsp-server/src/config_data.ml +++ b/ocaml-lsp-server/src/config_data.ml @@ -192,7 +192,10 @@ module InlayHints = struct end module Lens = struct - type t = { enable : bool [@default true] } + type t = + { enable : bool [@default true] + ; for_nested_bindings : bool [@key "forNestedBindings"] [@default false] + } [@@deriving_inline yojson] [@@yojson.allow_extra_fields] let _ = fun (_ : t) -> () @@ -202,6 +205,7 @@ module Lens = struct function | `Assoc field_yojsons as yojson -> let enable_field = ref Ppx_yojson_conv_lib.Option.None + and for_nested_bindings_field = ref Ppx_yojson_conv_lib.Option.None and duplicates = ref [] and extra = ref [] in let rec iter = function @@ -214,6 +218,13 @@ module Lens = struct enable_field := Ppx_yojson_conv_lib.Option.Some fvalue | Ppx_yojson_conv_lib.Option.Some _ -> duplicates := field_name :: Ppx_yojson_conv_lib.( ! ) duplicates) + | "forNestedBindings" -> + (match Ppx_yojson_conv_lib.( ! ) for_nested_bindings_field with + | Ppx_yojson_conv_lib.Option.None -> + let fvalue = bool_of_yojson _field_yojson in + for_nested_bindings_field := Ppx_yojson_conv_lib.Option.Some fvalue + | Ppx_yojson_conv_lib.Option.Some _ -> + duplicates := field_name :: Ppx_yojson_conv_lib.( ! ) duplicates) | _ -> ()); iter tail | [] -> () @@ -233,11 +244,18 @@ module Lens = struct (Ppx_yojson_conv_lib.( ! ) extra) yojson | [] -> - let enable_value = Ppx_yojson_conv_lib.( ! ) enable_field in + let enable_value, for_nested_bindings_value = + ( Ppx_yojson_conv_lib.( ! ) enable_field + , Ppx_yojson_conv_lib.( ! ) for_nested_bindings_field ) + in { enable = (match enable_value with | Ppx_yojson_conv_lib.Option.None -> true | Ppx_yojson_conv_lib.Option.Some v -> v) + ; for_nested_bindings = + (match for_nested_bindings_value with + | Ppx_yojson_conv_lib.Option.None -> false + | Ppx_yojson_conv_lib.Option.Some v -> v) })) | _ as yojson -> Ppx_yojson_conv_lib.Yojson_conv_error.record_list_instead_atom _tp_loc yojson @@ -248,8 +266,12 @@ module Lens = struct let yojson_of_t = (function - | { enable = v_enable } -> + | { enable = v_enable; for_nested_bindings = v_for_nested_bindings } -> let bnds : (string * Ppx_yojson_conv_lib.Yojson.Safe.t) list = [] in + let bnds = + let arg = yojson_of_bool v_for_nested_bindings in + ("forNestedBindings", arg) :: bnds + in let bnds = let arg = yojson_of_bool v_enable in ("enable", arg) :: bnds @@ -921,7 +943,7 @@ let _ = yojson_of_t [@@@end] let default = - { codelens = Some { enable = false } + { codelens = Some { enable = false; for_nested_bindings = false } ; extended_hover = Some { enable = false } ; standard_hover = Some { enable = true } ; inlay_hints = diff --git a/ocaml-lsp-server/src/custom_requests/custom_request.ml b/ocaml-lsp-server/src/custom_requests/custom_request.ml index 0152afe10..1bb47a0bb 100644 --- a/ocaml-lsp-server/src/custom_requests/custom_request.ml +++ b/ocaml-lsp-server/src/custom_requests/custom_request.ml @@ -10,3 +10,6 @@ module Wrapping_ast_node = Req_wrapping_ast_node module Get_documentation = Req_get_documentation module Type_search = Req_type_search module Merlin_jump = Req_merlin_jump +module Phrase = Req_phrase +module Type_expression = Req_type_expression +module Locate = Req_locate diff --git a/ocaml-lsp-server/src/custom_requests/custom_request.mli b/ocaml-lsp-server/src/custom_requests/custom_request.mli index 13027eb59..a5c005bce 100644 --- a/ocaml-lsp-server/src/custom_requests/custom_request.mli +++ b/ocaml-lsp-server/src/custom_requests/custom_request.mli @@ -12,3 +12,6 @@ module Wrapping_ast_node = Req_wrapping_ast_node module Get_documentation = Req_get_documentation module Type_search = Req_type_search module Merlin_jump = Req_merlin_jump +module Phrase = Req_phrase +module Type_expression = Req_type_expression +module Locate = Req_locate diff --git a/ocaml-lsp-server/src/custom_requests/req_locate.ml b/ocaml-lsp-server/src/custom_requests/req_locate.ml new file mode 100644 index 000000000..cd767c56d --- /dev/null +++ b/ocaml-lsp-server/src/custom_requests/req_locate.ml @@ -0,0 +1,79 @@ +open Import + +let meth = "ocamllsp/locate" +let capability = "handleLocate", `Bool true + +module Request_params = struct + type t = + { text_document : TextDocumentIdentifier.t + ; kind : [ `Type_definition | `Definition | `Declaration ] + ; position : Position.t + ; prefix : string option + } + + let create ?prefix ~text_document ~kind ~position () = + { text_document; position; prefix; kind } + ;; + + let yojson_of_t { text_document; kind; position; prefix } = + match TextDocumentIdentifier.yojson_of_t text_document with + | `Assoc assoc -> + let position = "position", Position.yojson_of_t position + and kind = + ( "kind" + , `String + (match kind with + | `Type_definition -> "type-definition" + | `Declaration -> "declaration" + | `Definition -> "definition") ) + and prefix = + ( "prefix" + , match prefix with + | None -> `Null + | Some p -> `String p ) + in + `Assoc (position :: prefix :: kind :: assoc) + | _ -> (* unreachable *) assert false + ;; + + let kind_of_yojson json = + let open Yojson.Safe.Util in + json + |> member "kind" + |> to_string_option + |> Option.map ~f:String.lowercase_ascii + |> function + | Some "type-definition" -> `Type_definition + | Some "declaration" -> `Declaration + | _ -> `Definition + ;; + + let t_of_yojson json = + let open Yojson.Safe.Util in + let text_document = json |> TextDocumentIdentifier.t_of_yojson + and kind = kind_of_yojson json + and position = json |> member "position" |> Position.t_of_yojson + and prefix = json |> member "prefix" |> to_string_option in + create ~text_document ~position ~kind ?prefix () + ;; +end + +type t = Location.t + +let t_of_yojson = Location.t_of_yojson + +let yojson_of_t = function + | Some (`Location locs) -> `List (List.map ~f:Location.yojson_of_t locs) + | _ -> `Null +;; + +let on_request ~params state = + Fiber.of_thunk (fun () -> + let open Fiber.O in + let Request_params.{ text_document = { uri }; position; prefix; kind } = + (Option.value ~default:(`Assoc []) params :> Yojson.Safe.t) + |> Request_params.t_of_yojson + in + let+ result = Definition_query.run ?prefix kind state uri position in + yojson_of_t result) +;; diff --git a/ocaml-lsp-server/src/custom_requests/req_locate.mli b/ocaml-lsp-server/src/custom_requests/req_locate.mli new file mode 100644 index 000000000..17d4bd380 --- /dev/null +++ b/ocaml-lsp-server/src/custom_requests/req_locate.mli @@ -0,0 +1,22 @@ +open Import + +module Request_params : sig + type t + + val yojson_of_t : t -> Json.t + + val create + : ?prefix:string + -> text_document:TextDocumentIdentifier.t + -> kind:[ `Type_definition | `Definition | `Declaration ] + -> position:Position.t + -> unit + -> t +end + +type t + +val t_of_yojson : Json.t -> t +val meth : string +val capability : string * [> `Bool of bool ] +val on_request : params:Jsonrpc.Structured.t option -> State.t -> Json.t Fiber.t diff --git a/ocaml-lsp-server/src/custom_requests/req_phrase.ml b/ocaml-lsp-server/src/custom_requests/req_phrase.ml new file mode 100644 index 000000000..640b27faa --- /dev/null +++ b/ocaml-lsp-server/src/custom_requests/req_phrase.ml @@ -0,0 +1,80 @@ +open Import + +let meth = "ocamllsp/phrase" +let capability = "handlePhrase", `Bool true + +module Request_params = struct + type t = + { text_document : TextDocumentIdentifier.t + ; position : Position.t + ; target : [ `Prev | `Next ] + } + + let create ~text_document ~position ~target = { text_document; position; target } + + let yojson_of_t { text_document; position; target } = + match TextDocumentIdentifier.yojson_of_t text_document with + | `Assoc assoc -> + let position = "position", Position.yojson_of_t position + and target = + ( "target" + , `String + (match target with + | `Next -> "next" + | `Prev -> "prev") ) + in + `Assoc (position :: target :: assoc) + | _ -> (* unreachable *) assert false + ;; + + let target_of_yojson json = + let open Yojson.Safe.Util in + json + |> member "target" + |> to_string_option + |> Option.map ~f:String.lowercase_ascii + |> function + | Some "next" -> `Next + | Some "prev" -> `Prev + | _ -> `Next + ;; + + let t_of_yojson json = + let open Yojson.Safe.Util in + let text_document = json |> TextDocumentIdentifier.t_of_yojson + and position = json |> member "position" |> Position.t_of_yojson + and target = target_of_yojson json in + create ~text_document ~position ~target + ;; +end + +type t = Position.t + +let t_of_yojson x = Position.t_of_yojson x + +let with_pipeline state uri f = + let doc = Document_store.get state.State.store uri in + match Document.kind doc with + | `Other -> Fiber.return `Null + | `Merlin merlin -> Document.Merlin.with_pipeline_exn merlin f +;; + +let make_phrase_command position target = Query_protocol.Phrase (target, position) + +let dispatch_phrase position target pipeline = + let position = Position.logical position in + let command = make_phrase_command position target in + let result = Query_commands.dispatch pipeline command in + match Position.of_lexical_position result with + | None -> `Null + | Some pos -> Position.yojson_of_t pos +;; + +let on_request ~params state = + Fiber.of_thunk (fun () -> + let Request_params.{ text_document = { uri }; position; target } = + (Option.value ~default:(`Assoc []) params :> Yojson.Safe.t) + |> Request_params.t_of_yojson + in + with_pipeline state uri @@ dispatch_phrase position target) +;; diff --git a/ocaml-lsp-server/src/custom_requests/req_phrase.mli b/ocaml-lsp-server/src/custom_requests/req_phrase.mli new file mode 100644 index 000000000..21e4d6647 --- /dev/null +++ b/ocaml-lsp-server/src/custom_requests/req_phrase.mli @@ -0,0 +1,20 @@ +open Import + +module Request_params : sig + type t + + val yojson_of_t : t -> Json.t + + val create + : text_document:TextDocumentIdentifier.t + -> position:Position.t + -> target:[ `Next | `Prev ] + -> t +end + +type t + +val t_of_yojson : Json.t -> t +val meth : string +val capability : string * [> `Bool of bool ] +val on_request : params:Jsonrpc.Structured.t option -> State.t -> Json.t Fiber.t diff --git a/ocaml-lsp-server/src/custom_requests/req_type_expression.ml b/ocaml-lsp-server/src/custom_requests/req_type_expression.ml new file mode 100644 index 000000000..210b414df --- /dev/null +++ b/ocaml-lsp-server/src/custom_requests/req_type_expression.ml @@ -0,0 +1,72 @@ +open Import + +let meth = "ocamllsp/typeExpression" +let capability = "handleTypeExpression", `Bool true + +module Request_params = struct + type t = + { text_document : TextDocumentIdentifier.t + ; position : Position.t + ; expression : string + } + + let create ~text_document ~position ~expression = + { text_document; position; expression } + ;; + + let yojson_of_t { text_document; position; expression } = + match TextDocumentIdentifier.yojson_of_t text_document with + | `Assoc assoc -> + let position = "position", Position.yojson_of_t position + and expression = "expression", `String expression in + `Assoc (position :: expression :: assoc) + | _ -> (* unreachable *) assert false + ;; + + let t_of_yojson json = + let open Yojson.Safe.Util in + let text_document = json |> TextDocumentIdentifier.t_of_yojson + and position = json |> member "position" |> Position.t_of_yojson + and expression = json |> member "expression" |> to_string in + create ~text_document ~position ~expression + ;; +end + +type t = string + +let t_of_yojson = Yojson.Safe.Util.to_string + +let with_pipeline state uri f = + let doc = Document_store.get state.State.store uri in + match Document.kind doc with + | `Other -> Fiber.return None + | `Merlin merlin -> Document.Merlin.with_pipeline_exn merlin f +;; + +let make_type_expr_command position expression = + Query_protocol.Type_expr (expression, position) +;; + +let dispatch_type_expr position expression pipeline = + let position = Position.logical position in + let command = make_type_expr_command position expression in + let result = Query_commands.dispatch pipeline command in + Some result +;; + +let on_request ~params state = + let open Fiber.O in + Fiber.of_thunk (fun () -> + let Request_params.{ text_document = { uri }; position; expression } = + (Option.value ~default:(`Assoc []) params :> Yojson.Safe.t) + |> Request_params.t_of_yojson + in + let* typ = with_pipeline state uri (dispatch_type_expr position expression) in + match typ with + | Some typ -> + let* result = Ocamlformat_rpc.format_type ~typ state.ocamlformat_rpc in + (match result with + | Error _ -> Fiber.return (`String typ) + | Ok typ -> Fiber.return (`String (String.trim ~drop:(Char.equal '\n') typ))) + | None -> Fiber.return `Null) +;; diff --git a/ocaml-lsp-server/src/custom_requests/req_type_expression.mli b/ocaml-lsp-server/src/custom_requests/req_type_expression.mli new file mode 100644 index 000000000..27abbec5e --- /dev/null +++ b/ocaml-lsp-server/src/custom_requests/req_type_expression.mli @@ -0,0 +1,20 @@ +open Import + +module Request_params : sig + type t + + val yojson_of_t : t -> Json.t + + val create + : text_document:TextDocumentIdentifier.t + -> position:Position.t + -> expression:string + -> t +end + +type t + +val t_of_yojson : Json.t -> t +val meth : string +val capability : string * [> `Bool of bool ] +val on_request : params:Jsonrpc.Structured.t option -> State.t -> Json.t Fiber.t diff --git a/ocaml-lsp-server/src/definition_query.ml b/ocaml-lsp-server/src/definition_query.ml index e836f3e3b..29045dd52 100644 --- a/ocaml-lsp-server/src/definition_query.ml +++ b/ocaml-lsp-server/src/definition_query.ml @@ -30,7 +30,7 @@ let location_of_merlin_loc uri : _ -> (_, string) result = function `Location locs)) ;; -let run kind (state : State.t) uri position = +let run kind (state : State.t) ?prefix uri position = let* () = Fiber.return () in let doc = Document_store.get state.store uri in match Document.kind doc with @@ -39,8 +39,8 @@ let run kind (state : State.t) uri position = let command, name = let pos = Position.logical position in match kind with - | `Definition -> Query_protocol.Locate (None, `ML, pos), "definition" - | `Declaration -> Query_protocol.Locate (None, `MLI, pos), "declaration" + | `Definition -> Query_protocol.Locate (prefix, `ML, pos), "definition" + | `Declaration -> Query_protocol.Locate (prefix, `MLI, pos), "declaration" | `Type_definition -> Query_protocol.Locate_type pos, "type definition" in let* result = Document.Merlin.dispatch_exn ~name doc command in diff --git a/ocaml-lsp-server/src/definition_query.mli b/ocaml-lsp-server/src/definition_query.mli index b1024439a..787280534 100644 --- a/ocaml-lsp-server/src/definition_query.mli +++ b/ocaml-lsp-server/src/definition_query.mli @@ -3,6 +3,7 @@ open Import val run : [ `Definition | `Declaration | `Type_definition ] -> State.t + -> ?prefix:string -> Uri.t -> Position.t -> [> `Location of Import.Location.t list ] option Fiber.t diff --git a/ocaml-lsp-server/src/document.ml b/ocaml-lsp-server/src/document.ml index ec1ec2956..fd4a64da4 100644 --- a/ocaml-lsp-server/src/document.ml +++ b/ocaml-lsp-server/src/document.ml @@ -8,7 +8,7 @@ module Kind = struct let of_fname_opt p = match Filename.extension p with - | ".ml" | ".eliom" | ".re" -> Some Impl + | ".ml" | ".eliom" | ".re" | ".mll" | ".mly" | ".mlx" -> Some Impl | ".mli" | ".eliomi" | ".rei" -> Some Intf | _ -> None ;; @@ -32,6 +32,7 @@ module Syntax = struct | Menhir | Cram | Dune + | Mlx let human_name = function | Ocaml -> "OCaml" @@ -40,6 +41,7 @@ module Syntax = struct | Menhir -> "Menhir/ocamlyacc" | Cram -> "Cram" | Dune -> "Dune" + | Mlx -> "OCaml.mlx" ;; let all = @@ -52,6 +54,7 @@ module Syntax = struct ; "dune", Dune ; "dune-project", Dune ; "dune-workspace", Dune + ; "ocaml.mlx", Mlx ] ;; @@ -61,6 +64,7 @@ module Syntax = struct | s -> (match Filename.extension s with | ".eliomi" | ".eliom" | ".mli" | ".ml" -> Ok Ocaml + | ".mlx" -> Ok Mlx | ".rei" | ".re" -> Ok Reason | ".mll" -> Ok Ocamllex | ".mly" -> Ok Menhir @@ -156,10 +160,10 @@ end = struct let task = match Lev_fiber.Thread.task t.thread ~f:(fun () -> - let start = Unix.time () in + let start = Unix.gettimeofday () in let pipeline = make_pipeline () in let res = Mpipeline.with_pipeline pipeline (fun () -> f pipeline) in - let stop = Unix.time () in + let stop = Unix.gettimeofday () in res, start, stop) with | Error `Stopped -> assert false @@ -252,7 +256,7 @@ let make wheel config pipeline (doc : DidOpenTextDocumentParams.t) ~position_enc let tdoc = Text_document.make ~position_encoding doc in let syntax = Syntax.of_text_document tdoc in match syntax with - | Ocaml | Reason -> make_merlin wheel config pipeline tdoc syntax + | Ocaml | Reason | Mlx -> make_merlin wheel config pipeline tdoc syntax | Ocamllex | Menhir | Cram | Dune -> Fiber.return (Other { tdoc; syntax })) ;; @@ -421,8 +425,8 @@ let close t = let get_impl_intf_counterparts m uri = let fpath = Uri.to_path uri in let fname = Filename.basename fpath in - let ml, mli, eliom, eliomi, re, rei, mll, mly = - "ml", "mli", "eliom", "eliomi", "re", "rei", "mll", "mly" + let ml, mli, eliom, eliomi, re, rei, mll, mly, mlx = + "ml", "mli", "eliom", "eliomi", "re", "rei", "mll", "mly", "mlx" in let exts_to_switch_to = let kind = @@ -436,13 +440,17 @@ let get_impl_intf_counterparts m uri = in match Syntax.of_fname fname with | Dune | Cram -> [] + | Mlx -> + (match kind with + | Intf -> [ ml; mly; mll; mlx; re ] + | Impl -> [ rei; mli; mly; mll; rei ]) | Ocaml -> (match kind with - | Intf -> [ ml; mly; mll; eliom; re ] + | Intf -> [ ml; mly; mll; eliom; re; mlx ] | Impl -> [ mli; mly; mll; eliomi; rei ]) | Reason -> (match kind with - | Intf -> [ re; ml ] + | Intf -> [ re; ml; mlx ] | Impl -> [ rei; mli ]) | Ocamllex -> [ mli; rei ] | Menhir -> [ mli; rei ] diff --git a/ocaml-lsp-server/src/document.mli b/ocaml-lsp-server/src/document.mli index 735bfd659..6585b6f0b 100644 --- a/ocaml-lsp-server/src/document.mli +++ b/ocaml-lsp-server/src/document.mli @@ -10,6 +10,7 @@ module Syntax : sig | Menhir | Cram | Dune + | Mlx val human_name : t -> string val markdown_name : t -> string diff --git a/ocaml-lsp-server/src/dune.ml b/ocaml-lsp-server/src/dune.ml index 9ebacc37b..e3dbdad2b 100644 --- a/ocaml-lsp-server/src/dune.ml +++ b/ocaml-lsp-server/src/dune.ml @@ -112,10 +112,7 @@ module Poll = | s -> Ok (`Mtime s.st_mtime) ;; - let read_file s = - Fiber.of_thunk (fun () -> - Fiber.return (Result.try_with (fun () -> Io.String_path.read_file s))) - ;; + let read_file s = Fiber.of_thunk (fun () -> Fiber.return (Io.read_file s)) end) type config = diff --git a/ocaml-lsp-server/src/hover_req.ml b/ocaml-lsp-server/src/hover_req.ml index 8a5f932b6..170135475 100644 --- a/ocaml-lsp-server/src/hover_req.ml +++ b/ocaml-lsp-server/src/hover_req.ml @@ -58,8 +58,10 @@ let hover_at_cursor parsetree (`Logical (cursor_line, cursor_col)) = then ( match expr.pexp_desc with | Pexp_constant _ | Pexp_variant _ | Pexp_pack _ -> result := Some `Type_enclosing - | Pexp_ident { loc; _ } | Pexp_construct ({ loc; _ }, _) | Pexp_field (_, { loc; _ }) - -> + | Pexp_ident { loc; _ } + | Pexp_construct ({ loc; _ }, _) + | Pexp_field (_, { loc; _ }) + | Pexp_send (_, { loc; _ }) -> if is_at_cursor loc then result := Some `Type_enclosing else Ast_iterator.default_iterator.expr self expr diff --git a/ocaml-lsp-server/src/import.ml b/ocaml-lsp-server/src/import.ml index 48210f5fd..9e9d17d69 100644 --- a/ocaml-lsp-server/src/import.ml +++ b/ocaml-lsp-server/src/import.ml @@ -9,7 +9,6 @@ include struct module Table = Table module Tuple = Tuple module Unix_env = Env - module Io = Io module Map = Map module Monoid = Monoid module Pid = Pid @@ -18,6 +17,31 @@ include struct let sprintf = sprintf end +module Io = struct + open Base + + let read_file f = + Base.Result.try_with (fun () -> + let fd = Unix.openfile f [ O_CLOEXEC; O_RDONLY ] 0 in + Exn.protect + ~finally:(fun () -> Unix.close fd) + ~f:(fun () -> + match Unix.fstat fd with + | { Unix.st_size; _ } -> + let buf = Bytes.create st_size in + let rec loop pos remains = + if remains > 0 + then ( + let read = Unix.read fd buf pos remains in + if read = 0 + then failwith (sprintf "unable to read all of %s" f) + else loop (pos + read) (remains - read)) + in + loop 0 st_size; + Stdlib.Bytes.unsafe_to_string buf)) + ;; +end + include struct open Base module Queue = Queue @@ -37,13 +61,34 @@ include struct end module List = struct - include Stdune.List - open Base.List + include Base.List + + let compare xs ys ~compare = + Base.List.compare (fun x y -> Ordering.to_int (compare x y)) xs ys + ;; + let sort xs ~compare = sort xs ~compare:(fun x y -> Ordering.to_int (compare x y)) + let fold_left2 xs ys ~init ~f = Stdlib.List.fold_left2 f init xs ys + let assoc xs key = Assoc.find ~equal:Poly.equal xs key + let assoc_opt xs key = assoc xs key + let mem t x ~equal = mem t x ~equal + let map t ~f = map t ~f + let concat_map t ~f = concat_map t ~f + let flatten t = Stdlib.List.flatten t + let filter_map t ~f = filter_map t ~f + let fold_left t ~init ~f = fold_left t ~init ~f let findi xs ~f = findi xs ~f + let find_opt xs ~f = find xs ~f + + let sort_uniq xs ~compare = + Stdlib.List.sort_uniq (fun x y -> Ordering.to_int (compare x y)) xs + ;; + + let for_all xs ~f = for_all xs ~f let find_mapi xs ~f = find_mapi xs ~f let sub xs ~pos ~len = sub xs ~pos ~len let hd_exn t = hd_exn t + let hd_opt t = hd t let nth_exn t n = nth_exn t n let hd t = hd t let filter t ~f = filter t ~f @@ -86,6 +131,8 @@ module String = struct include struct open Stdune.String module Map = Map + + let extract_words = extract_words end let to_dyn = Dyn.string @@ -124,7 +171,6 @@ module String = struct let lfindi = lfindi let filter = filter let is_suffix = is_suffix - let extract_words = Stdune.String.extract_words end let findi = @@ -177,6 +223,8 @@ include struct include Uri let to_dyn t = Dyn.string (to_string t) + + module Map = Stdlib.Map.Make (Uri) end end diff --git a/ocaml-lsp-server/src/inference.ml b/ocaml-lsp-server/src/inference.ml index d51401e31..3771fe90f 100644 --- a/ocaml-lsp-server/src/inference.ml +++ b/ocaml-lsp-server/src/inference.ml @@ -71,6 +71,7 @@ let language_id_of_fname s = | ".mli" | ".eliomi" -> "ocaml.interface" | ".ml" | ".eliom" -> "ocaml" | ".rei" | ".re" -> "reason" + | ".mlx" -> "ocaml.mlx" | ".mll" -> "ocaml.ocamllex" | ".mly" -> "ocaml.menhir" | ext -> Code_error.raise "unsupported file extension" [ "extension", String ext ] @@ -79,12 +80,12 @@ let language_id_of_fname s = let open_document_from_file (state : State.t) uri = let filename = Uri.to_path uri in Fiber.of_thunk (fun () -> - match Io.String_path.read_file filename with - | exception Sys_error _ -> + match Io.read_file filename with + | Error _ -> Log.log ~section:"debug" (fun () -> Log.msg "Unable to open file" [ "filename", `String filename ]); Fiber.return None - | text -> + | Ok text -> let languageId = language_id_of_fname filename in let text_document = TextDocumentItem.create ~uri ~languageId ~version:0 ~text in let params = DidOpenTextDocumentParams.create ~textDocument:text_document in diff --git a/ocaml-lsp-server/src/merlin_config.ml b/ocaml-lsp-server/src/merlin_config.ml index 50ce15d5d..4e0a55096 100644 --- a/ocaml-lsp-server/src/merlin_config.ml +++ b/ocaml-lsp-server/src/merlin_config.ml @@ -119,7 +119,7 @@ module Dot_protocol_io = let write t x = write t [ x ] end) -let should_read_dot_merlin = ref false +let prefer_dot_merlin = ref false type db = { running : (string, entry) Table.t @@ -299,13 +299,13 @@ let config (t : t) : Mconfig.t Fiber.t = t.entry <- Some entry in let* () = Fiber.return () in - if !should_read_dot_merlin + if !prefer_dot_merlin then Fiber.return (Mconfig.get_external_config t.path t.initial) else ( match find_project_context t.directory with | None -> let+ () = destroy t in - t.initial + Mconfig.get_external_config t.path t.initial | Some (ctx, config_path) -> let* entry = get_process t.db ~dir:ctx.process_dir in let* () = diff --git a/ocaml-lsp-server/src/merlin_config.mli b/ocaml-lsp-server/src/merlin_config.mli index bc057f038..b8431d471 100644 --- a/ocaml-lsp-server/src/merlin_config.mli +++ b/ocaml-lsp-server/src/merlin_config.mli @@ -4,7 +4,7 @@ open Import type t -val should_read_dot_merlin : bool ref +val prefer_dot_merlin : bool ref val config : t -> Mconfig.t Fiber.t val destroy : t -> unit Fiber.t diff --git a/ocaml-lsp-server/src/ocaml_lsp_server.ml b/ocaml-lsp-server/src/ocaml_lsp_server.ml index 3a2ea56f4..af7b81c6f 100644 --- a/ocaml-lsp-server/src/ocaml_lsp_server.ml +++ b/ocaml-lsp-server/src/ocaml_lsp_server.ml @@ -99,6 +99,9 @@ let initialize_info (client_capabilities : ClientCapabilities.t) : InitializeRes ; Req_construct.capability ; Req_type_search.capability ; Req_merlin_jump.capability + ; Req_phrase.capability + ; Req_type_expression.capability + ; Req_locate.capability ] ) ] in @@ -203,7 +206,7 @@ let set_diagnostics detached diagnostics doc = in Diagnostics.set diagnostics (`Merlin (uri, [ no_reason_merlin ])); async (fun () -> Diagnostics.send diagnostics (`One uri)) - | Reason | Ocaml -> + | Reason | Ocaml | Mlx -> async (fun () -> let* () = Diagnostics.merlin_diagnostics diagnostics merlin in Diagnostics.send diagnostics (`One uri))) @@ -363,7 +366,11 @@ module Formatter = struct ;; end -let text_document_lens (state : State.t) { CodeLensParams.textDocument = { uri }; _ } = +let text_document_lens + (state : State.t) + { CodeLensParams.textDocument = { uri }; _ } + ~for_nested_bindings + = let store = state.store in let doc = Document_store.get store uri in match Document.kind doc with @@ -372,7 +379,11 @@ let text_document_lens (state : State.t) { CodeLensParams.textDocument = { uri } | `Merlin doc -> let+ outline = Document.Merlin.dispatch_exn ~name:"outline" doc Outline in let rec symbol_info_of_outline_item (item : Query_protocol.item) = - let children = List.concat_map item.children ~f:symbol_info_of_outline_item in + let children = + if for_nested_bindings + then List.concat_map item.children ~f:symbol_info_of_outline_item + else [] + in match item.outline_type with | None -> children | Some typ -> @@ -496,26 +507,30 @@ let on_request match req with | Client_request.UnknownRequest { meth; params } -> (match - [ ( Req_switch_impl_intf.meth - , fun ~params state -> - Fiber.of_thunk (fun () -> - Fiber.return (Req_switch_impl_intf.on_request ~params state)) ) - ; Req_infer_intf.meth, Req_infer_intf.on_request - ; Req_typed_holes.meth, Req_typed_holes.on_request - ; Req_jump_to_typed_hole.meth, Req_jump_to_typed_hole.on_request - ; Req_merlin_call_compatible.meth, Req_merlin_call_compatible.on_request - ; Req_type_enclosing.meth, Req_type_enclosing.on_request - ; Req_get_documentation.meth, Req_get_documentation.on_request - ; Req_merlin_jump.meth, Req_merlin_jump.on_request - ; Req_wrapping_ast_node.meth, Req_wrapping_ast_node.on_request - ; Req_type_search.meth, Req_type_search.on_request - ; Req_construct.meth, Req_construct.on_request - ; ( Semantic_highlighting.Debug.meth_request_full - , Semantic_highlighting.Debug.on_request_full ) - ; ( Req_hover_extended.meth - , fun ~params _ -> Req_hover_extended.on_request ~params rpc ) - ] - |> List.assoc_opt meth + List.assoc + [ ( Req_switch_impl_intf.meth + , fun ~params state -> + Fiber.of_thunk (fun () -> + Fiber.return (Req_switch_impl_intf.on_request ~params state)) ) + ; Req_infer_intf.meth, Req_infer_intf.on_request + ; Req_typed_holes.meth, Req_typed_holes.on_request + ; Req_jump_to_typed_hole.meth, Req_jump_to_typed_hole.on_request + ; Req_merlin_call_compatible.meth, Req_merlin_call_compatible.on_request + ; Req_type_enclosing.meth, Req_type_enclosing.on_request + ; Req_get_documentation.meth, Req_get_documentation.on_request + ; Req_merlin_jump.meth, Req_merlin_jump.on_request + ; Req_wrapping_ast_node.meth, Req_wrapping_ast_node.on_request + ; Req_type_search.meth, Req_type_search.on_request + ; Req_construct.meth, Req_construct.on_request + ; ( Semantic_highlighting.Debug.meth_request_full + , Semantic_highlighting.Debug.on_request_full ) + ; ( Req_hover_extended.meth + , fun ~params _ -> Req_hover_extended.on_request ~params rpc ) + ; Req_phrase.meth, Req_phrase.on_request + ; Req_type_expression.meth, Req_type_expression.on_request + ; Req_locate.meth, Req_locate.on_request + ] + meth with | None -> Jsonrpc.Response.Error.raise @@ -620,7 +635,8 @@ let on_request | TextDocumentCodeLensResolve codeLens -> now codeLens | TextDocumentCodeLens req -> (match state.configuration.data.codelens with - | Some { enable = true } -> later text_document_lens req + | Some { enable = true; for_nested_bindings } -> + later (text_document_lens ~for_nested_bindings) req | _ -> now []) | TextDocumentHighlight req -> later highlight req | DocumentSymbol { textDocument = { uri }; _ } -> later document_symbol uri @@ -954,10 +970,10 @@ let run_in_directory = fun () -> if Sys.win32 then for_windows else run_in_directory ;; -let run channel ~read_dot_merlin () = +let run channel ~prefer_dot_merlin () = Merlin_utils.Lib_config.set_program_name "ocamllsp"; Merlin_utils.Lib_config.System.set_run_in_directory (run_in_directory ()); - Merlin_config.should_read_dot_merlin := read_dot_merlin; + Merlin_config.prefer_dot_merlin := prefer_dot_merlin; Unix.putenv "__MERLIN_MASTER_PID" (string_of_int (Unix.getpid ())); Lev_fiber.run ~sigpipe:`Ignore (fun () -> let* input, output = stream_of_channel channel in diff --git a/ocaml-lsp-server/src/ocaml_lsp_server.mli b/ocaml-lsp-server/src/ocaml_lsp_server.mli index e74891253..76cc6c224 100644 --- a/ocaml-lsp-server/src/ocaml_lsp_server.mli +++ b/ocaml-lsp-server/src/ocaml_lsp_server.mli @@ -1,4 +1,4 @@ -val run : Lsp.Cli.Channel.t -> read_dot_merlin:bool -> unit -> unit +val run : Lsp.Cli.Channel.t -> prefer_dot_merlin:bool -> unit -> unit module Diagnostics = Diagnostics module Version = Version diff --git a/ocaml-lsp-server/src/ocamlformat.ml b/ocaml-lsp-server/src/ocamlformat.ml index 28437f21f..4c6ce3757 100644 --- a/ocaml-lsp-server/src/ocamlformat.ml +++ b/ocaml-lsp-server/src/ocamlformat.ml @@ -100,9 +100,11 @@ let message = function type formatter = | Reason of Document.Kind.t | Ocaml of Uri.t + | Mlx of Uri.t let args = function | Ocaml uri -> [ sprintf "--name=%s" (Uri.to_path uri); "-" ] + | Mlx uri -> [ "--impl"; sprintf "--name=%s" (Uri.to_path uri); "-" ] | Reason kind -> [ "--parse"; "re"; "--print"; "re" ] @ @@ -114,6 +116,7 @@ let args = function let binary_name t = match t with | Ocaml _ -> "ocamlformat" + | Mlx _ -> "ocamlformat-mlx" | Reason _ -> "refmt" ;; @@ -128,6 +131,7 @@ let formatter doc = match Document.syntax doc with | (Dune | Cram | Ocamllex | Menhir) as s -> Error (Unsupported_syntax s) | Ocaml -> Ok (Ocaml (Document.uri doc)) + | Mlx -> Ok (Mlx (Document.uri doc)) | Reason -> Ok (Reason diff --git a/ocaml-lsp-server/src/ocamlformat.mli b/ocaml-lsp-server/src/ocamlformat.mli index 0d6edc6c1..186f692ba 100644 --- a/ocaml-lsp-server/src/ocamlformat.mli +++ b/ocaml-lsp-server/src/ocamlformat.mli @@ -1,6 +1,7 @@ (** Generic formatting facility for OCaml and Reason sources. - Relies on [ocamlformat] for OCaml and [refmt] for reason *) + Relies on [ocamlformat] for OCaml, [ocamlformat-mlx] for OCaml.mlx, and + [refmt] for Reason. *) open Import diff --git a/ocaml-lsp-server/src/semantic_highlighting.ml b/ocaml-lsp-server/src/semantic_highlighting.ml index a783fccba..f5e55525f 100644 --- a/ocaml-lsp-server/src/semantic_highlighting.ml +++ b/ocaml-lsp-server/src/semantic_highlighting.ml @@ -427,8 +427,7 @@ end = struct let value_binding (self : Ast_iterator.iterator) - ({ pvb_pat; pvb_expr; pvb_attributes; pvb_loc = _ } as vb : - Parsetree.value_binding) + ({ pvb_pat; pvb_expr; pvb_attributes; _ } as vb : Parsetree.value_binding) = match match pvb_pat.ppat_desc, pvb_expr.pexp_desc with diff --git a/ocaml-lsp-server/src/workspace_symbol.ml b/ocaml-lsp-server/src/workspace_symbol.ml index a0251a6b1..93c4611ad 100644 --- a/ocaml-lsp-server/src/workspace_symbol.ml +++ b/ocaml-lsp-server/src/workspace_symbol.ml @@ -70,17 +70,17 @@ end = struct open Browse_raw open Browse_tree - let id_of_patt = function - | { pat_desc = Tpat_var (id, _); _ } -> Some id + let name_of_patt = function + | { pat_desc = Tpat_var (_, name); _ } -> Some name | _ -> None ;; - let mk ?(children = []) ~location ~deprecated outline_kind id = + let mk ?(children = []) ~location ~deprecated outline_kind (id : string Location.loc) = { Query_protocol.outline_kind ; outline_type = None ; location ; children - ; outline_name = Ident.name id + ; outline_name = id.txt ; deprecated } ;; @@ -96,30 +96,30 @@ end = struct match node.t_node with | Value_binding vb -> let deprecated = Type_utils.is_deprecated vb.vb_attributes in - (match id_of_patt vb.vb_pat with + (match name_of_patt vb.vb_pat with | None -> None - | Some ident -> Some (mk ~location ~deprecated `Value ident)) + | Some name -> Some (mk ~location ~deprecated `Value name)) | Value_description vd -> let deprecated = Type_utils.is_deprecated vd.val_attributes in - Some (mk ~location ~deprecated `Value vd.val_id) + Some (mk ~location ~deprecated `Value vd.val_name) | Module_declaration md -> let children = get_mod_children node in - (match md.md_id with - | None -> None - | Some id -> + (match md.md_name with + | { txt = None; _ } -> None + | { txt = Some txt; loc } -> let deprecated = Type_utils.is_deprecated md.md_attributes in - Some (mk ~children ~location ~deprecated `Module id)) + Some (mk ~children ~location ~deprecated `Module { txt; loc })) | Module_binding mb -> let children = get_mod_children node in - (match mb.mb_id with - | None -> None - | Some id -> + (match mb.mb_name with + | { txt = None; _ } -> None + | { txt = Some txt; loc } -> let deprecated = Type_utils.is_deprecated mb.mb_attributes in - Some (mk ~children ~location ~deprecated `Module id)) + Some (mk ~children ~location ~deprecated `Module { txt; loc })) | Module_type_declaration mtd -> let children = get_mod_children node in let deprecated = Type_utils.is_deprecated mtd.mtd_attributes in - Some (mk ~deprecated ~children ~location `Modtype mtd.mtd_id) + Some (mk ~deprecated ~children ~location `Modtype mtd.mtd_name) | Type_declaration td -> let children = List.concat_map (Lazy.force node.t_children) ~f:(fun child -> @@ -129,16 +129,16 @@ end = struct match x.t_node with | Constructor_declaration c -> let deprecated = Type_utils.is_deprecated c.cd_attributes in - mk `Constructor c.cd_id ~deprecated ~location:c.cd_loc + mk `Constructor c.cd_name ~deprecated ~location:c.cd_loc | Label_declaration ld -> let deprecated = Type_utils.is_deprecated ld.ld_attributes in - mk `Label ld.ld_id ~deprecated ~location:ld.ld_loc + mk `Label ld.ld_name ~deprecated ~location:ld.ld_loc | _ -> assert false (* ! *)) | _ -> []) in let deprecated = Type_utils.is_deprecated td.typ_attributes in - Some (mk ~children ~location ~deprecated `Type td.typ_id) + Some (mk ~children ~location ~deprecated `Type td.typ_name) | Type_extension te -> let name = Path.name te.tyext_path in let children = @@ -156,11 +156,11 @@ end = struct } | Extension_constructor ec -> let deprecated = Type_utils.is_deprecated ec.ext_attributes in - Some (mk ~location `Exn ec.ext_id ~deprecated) + Some (mk ~location `Exn ec.ext_name ~deprecated) | Class_declaration cd -> let children = List.concat_map (Lazy.force node.t_children) ~f:get_class_elements in let deprecated = Type_utils.is_deprecated cd.ci_attributes in - Some (mk ~children ~location `Class cd.ci_id_class_type ~deprecated) + Some (mk ~children ~location `Class cd.ci_id_name ~deprecated) | _ -> None and get_class_elements node = @@ -177,7 +177,7 @@ end = struct { Query_protocol.outline_name = str_loc.Location.txt ; outline_kind ; outline_type = None - ; location = str_loc.Location.loc + ; location = cf.cf_loc ; children = [] ; deprecated } @@ -365,9 +365,7 @@ let run server (state : State.t) (params : WorkspaceSymbolParams.t) = | Error `Cancelled -> assert false | Error (`Exn exn) -> Exn_with_backtrace.reraise exn) in - List.partition_map symbols_results ~f:(function - | Ok r -> Left r - | Error e -> Right e) + List.partition_result symbols_results in let+ () = match errors with diff --git a/ocaml-lsp-server/test/e2e-new/code_lens.ml b/ocaml-lsp-server/test/e2e-new/code_lens.ml new file mode 100644 index 000000000..93ea7a2c0 --- /dev/null +++ b/ocaml-lsp-server/test/e2e-new/code_lens.ml @@ -0,0 +1,104 @@ +open Test.Import + +let change_config client params = Client.notification client (ChangeConfiguration params) + +let codelens client textDocument = + Client.request + client + (TextDocumentCodeLens + { textDocument; workDoneToken = None; partialResultToken = None }) +;; + +let json_of_codelens cs = `List (List.map ~f:CodeLens.yojson_of_t cs) + +let%expect_test "enable codelens for nested let bindings" = + let source = + {ocaml| +let toplevel = "Hello" + +let func x = x + +let f x = + let y = 10 in + let z = 3 in + x + y + z +|ocaml} + in + let req client = + let text_document = TextDocumentIdentifier.create ~uri:Helpers.uri in + let* () = + change_config + client + (DidChangeConfigurationParams.create + ~settings:(`Assoc [ "codelens", `Assoc [ "forNestedBindings", `Bool true ] ])) + in + let* resp_codelens_toplevel = codelens client text_document in + Test.print_result (json_of_codelens resp_codelens_toplevel); + Fiber.return () + in + Helpers.test source req; + (* FIXME this requires support in Merlin 414 LTS too *) + [%expect + {| + [ + { + "command": { "command": "", "title": "int -> int" }, + "range": { + "end": { "character": 11, "line": 8 }, + "start": { "character": 0, "line": 5 } + } + }, + { + "command": { "command": "", "title": "'a -> 'a" }, + "range": { + "end": { "character": 14, "line": 3 }, + "start": { "character": 0, "line": 3 } + } + }, + { + "command": { "command": "", "title": "string" }, + "range": { + "end": { "character": 22, "line": 1 }, + "start": { "character": 0, "line": 1 } + } + } + ] + |}] +;; + +let%expect_test "enable codelens (default settings disable it for nested let binding)" = + let source = + {ocaml| +let x = + let y = 10 in + "Hello" + +let () = () +|ocaml} + in + let req client = + let text_document = TextDocumentIdentifier.create ~uri:Helpers.uri in + let* () = + change_config + client + (DidChangeConfigurationParams.create + ~settings:(`Assoc [ "codelens", `Assoc [ "enable", `Bool true ] ])) + in + let* resp_codelens_toplevel = codelens client text_document in + Test.print_result (json_of_codelens resp_codelens_toplevel); + Fiber.return () + in + Helpers.test source req; + [%expect + {| + [ + { + "command": { "command": "", "title": "string" }, + "range": { + "end": { "character": 9, "line": 3 }, + "start": { "character": 0, "line": 1 } + } + } + ] + |}] +;; diff --git a/ocaml-lsp-server/test/e2e-new/document_symbol.ml b/ocaml-lsp-server/test/e2e-new/document_symbol.ml index 86206f6a3..74e2700e2 100644 --- a/ocaml-lsp-server/test/e2e-new/document_symbol.ml +++ b/ocaml-lsp-server/test/e2e-new/document_symbol.ml @@ -40,7 +40,7 @@ let%expect_test "documentOutline with a module" = {| module T = struct type t = int - end + end |} in let request client = @@ -223,6 +223,7 @@ let%expect_test "documentOutline with recursive definition" = |}] ;; +(* FIXME: requires fix in Merlin 4.14 LTS *) let%expect_test "documentOutline with recursive definition and methods" = let source = {| @@ -346,7 +347,7 @@ let%expect_test "documentOutline with nested recursive definition and methods" = class a = object val b = object method inside_a_b () = - val x_inside_a_b = 10 in + let x_inside_a_b = 10 in print_int x end end @@ -374,7 +375,7 @@ let%expect_test "documentOutline with nested recursive definition and methods" = "kind": 5, "location": { "range": { - "end": { "character": 8, "line": 6 }, + "end": { "character": 8, "line": 7 }, "start": { "character": 5, "line": 1 } }, "uri": "file:///test.ml" @@ -386,7 +387,7 @@ let%expect_test "documentOutline with nested recursive definition and methods" = "kind": 7, "location": { "range": { - "end": { "character": 16, "line": 5 }, + "end": { "character": 8, "line": 6 }, "start": { "character": 5, "line": 2 } }, "uri": "file:///test.ml" @@ -395,19 +396,7 @@ let%expect_test "documentOutline with nested recursive definition and methods" = }, { "containerName": "b", - "kind": 6, - "location": { - "range": { - "end": { "character": 27, "line": 3 }, - "start": { "character": 5, "line": 3 } - }, - "uri": "file:///test.ml" - }, - "name": "inside_a_b" - }, - { - "containerName": "b", - "kind": 7, + "kind": 13, "location": { "range": { "end": { "character": 26, "line": 4 }, diff --git a/ocaml-lsp-server/test/e2e-new/dune b/ocaml-lsp-server/test/e2e-new/dune index ba58aa87a..d2e2cd4d5 100644 --- a/ocaml-lsp-server/test/e2e-new/dune +++ b/ocaml-lsp-server/test/e2e-new/dune @@ -44,6 +44,7 @@ action_inline action_mark_remove code_actions + code_lens completion completions construct @@ -51,6 +52,7 @@ document_flow exit_notification for_ppx + hover hover_extended inlay_hints jump_to_typed_hole @@ -67,6 +69,9 @@ documentation document_symbol merlin_jump + phrase + type_expression + locate type_search with_pp with_ppx diff --git a/ocaml-lsp-server/test/e2e-new/hover.ml b/ocaml-lsp-server/test/e2e-new/hover.ml new file mode 100644 index 000000000..466352e9a --- /dev/null +++ b/ocaml-lsp-server/test/e2e-new/hover.ml @@ -0,0 +1,43 @@ +open Test.Import + +let print_hover hover = + match hover with + | None -> print_endline "no hover response" + | Some hover -> + hover |> Hover.yojson_of_t |> Yojson.Safe.pretty_to_string ~std:false |> print_endline +;; + +let hover client position = + Client.request + client + (TextDocumentHover + { HoverParams.position + ; textDocument = TextDocumentIdentifier.create ~uri:Helpers.uri + ; workDoneToken = None + }) +;; + +let%expect_test "object method call" = + let source = + {ocaml| +let f (o : < g : int -> unit >) = o#g 4 +|ocaml} + in + let position = Position.create ~line:1 ~character:38 in + let req client = + let* resp = hover client position in + let () = print_hover resp in + Fiber.return () + in + Helpers.test source req; + [%expect + {| + { + "contents": { "kind": "plaintext", "value": "int -> unit" }, + "range": { + "end": { "character": 38, "line": 1 }, + "start": { "character": 35, "line": 1 } + } + } + |}] +;; diff --git a/ocaml-lsp-server/test/e2e-new/inlay_hints.ml b/ocaml-lsp-server/test/e2e-new/inlay_hints.ml index 220f66220..9fbe92fd3 100644 --- a/ocaml-lsp-server/test/e2e-new/inlay_hints.ml +++ b/ocaml-lsp-server/test/e2e-new/inlay_hints.ml @@ -110,7 +110,7 @@ let%expect_test "function params" = {| let f a$: int$ b$: int$ c$: string$ d$: bool$ = (a + b, c ^ string_of_bool d) |}] ;; -(* Fixme: options doesn't work on 414 LTS *) +(* Fixme: options doesn't work on Merlin 414 LTS *) let%expect_test "function params (deactivated)" = let source = "let f a b c d = (a + b, c ^ string_of_bool d)" in apply_inlay_hints ~hint_function_params:false ~source (); diff --git a/ocaml-lsp-server/test/e2e-new/locate.ml b/ocaml-lsp-server/test/e2e-new/locate.ml new file mode 100644 index 000000000..96860fcc2 --- /dev/null +++ b/ocaml-lsp-server/test/e2e-new/locate.ml @@ -0,0 +1,105 @@ +open Test.Import +module Req = Ocaml_lsp_server.Custom_request.Locate + +module Util = struct + let call_locate ?prefix ?(kind = `Definition) ~position client = + let text_document = + TextDocumentIdentifier.create ~uri:(DocumentUri.of_path "test.ml") + in + let params = + Req.Request_params.create ~text_document ?prefix ~kind ~position () + |> Req.Request_params.yojson_of_t + |> Jsonrpc.Structured.t_of_yojson + |> Option.some + in + let req = Lsp.Client_request.UnknownRequest { meth = Req.meth; params } in + Client.request client req + ;; + + let sanitize_path = function + | `List ranges -> + `List + (List.map + ~f:(function + | `Assoc [ range; ("uri", `String value) ] -> + let new_value = + value + |> String.split_on_char ~sep:'/' + |> List.last + |> function + | None -> "unknown" + | Some x -> "file:///" ^ x + in + `Assoc [ range; "uri", `String new_value ] + | x -> x) + ranges) + | x -> x + ;; + + let test ?prefix ?(kind = `Definition) ~line ~character source = + let position = Position.create ~line ~character in + let request client = + let open Fiber.O in + let+ response = call_locate ?prefix ~kind ~position client in + Test.print_result (sanitize_path response) + in + Helpers.test source request + ;; +end + +let%expect_test "Locate identifier - 1" = + let source = {| let x = 10 let y = 11 |} + and line = 0 + and character = 23 in + Util.test ~line ~character ~prefix:"x" source; + [%expect + {| + [ + { + "range": { + "end": { "character": 5, "line": 0 }, + "start": { "character": 5, "line": 0 } + }, + "uri": "file:///test.ml" + } + ] + |}] +;; + +let%expect_test "Locate identifier - 2" = + let source = {| let x = 10 let y = 11 let z = 10 |} + and line = 0 + and character = 23 in + Util.test ~line ~character ~prefix:"y" source; + [%expect + {| + [ + { + "range": { + "end": { "character": 16, "line": 0 }, + "start": { "character": 16, "line": 0 } + }, + "uri": "file:///test.ml" + } + ] + |}] +;; + +let%expect_test "Locate identifier - 3" = + let source = {| let x = 10 let y = 11 |} + and line = 0 + and character = 23 in + Util.test ~line ~character ~prefix:"List.map" source; + [%expect + {| + [ + { + "range": { + "end": { "character": 8, "line": 89 }, + "start": { "character": 8, "line": 89 } + }, + "uri": "file:///list.ml" + } + ] + |}] +;; diff --git a/ocaml-lsp-server/test/e2e-new/merlin_call_compatible.ml b/ocaml-lsp-server/test/e2e-new/merlin_call_compatible.ml index 1059abd1d..0a99cff2f 100644 --- a/ocaml-lsp-server/test/e2e-new/merlin_call_compatible.ml +++ b/ocaml-lsp-server/test/e2e-new/merlin_call_compatible.ml @@ -90,7 +90,8 @@ let%expect_test "errors: warning is shown" = { "resultAsSexp": false, "result": "{\"class\":\"return\",\"value\":[{\"start\":{\"line\":1,\"col\":9},\"end\":{\"line\":1,\"col\":39},\"type\":\"warning\",\"sub\":[],\"valid\":true,\"message\":\"Warning 8: this pattern-matching is not exhaustive.\\nHere is an example of a case that is not matched:\\nSome _\"}]}" - } |}] + } + |}] ;; let%expect_test "errors: warning is disabled" = diff --git a/ocaml-lsp-server/test/e2e-new/phrase.ml b/ocaml-lsp-server/test/e2e-new/phrase.ml new file mode 100644 index 000000000..dcbb15c2c --- /dev/null +++ b/ocaml-lsp-server/test/e2e-new/phrase.ml @@ -0,0 +1,126 @@ +open Test.Import +module Req = Ocaml_lsp_server.Custom_request.Phrase + +module Util = struct + let call_phrase ~target ~position client = + let text_document = + TextDocumentIdentifier.create ~uri:(DocumentUri.of_path "test.ml") + in + let params = + Req.Request_params.create ~text_document ~position ~target + |> Req.Request_params.yojson_of_t + |> Jsonrpc.Structured.t_of_yojson + |> Option.some + in + let req = Lsp.Client_request.UnknownRequest { meth = Req.meth; params } in + Client.request client req + ;; + + let test ~target ~line ~character source = + let position = Position.create ~line ~character in + let request client = + let open Fiber.O in + let+ response = call_phrase ~target ~position client in + Test.print_result response + in + Helpers.test source request + ;; +end + +let%expect_test "Jump to the next phrase - 1" = + let source = {| let x = 10 let y = 11 |} + and line = 0 + and character = 9 + and target = `Next in + Util.test ~line ~character ~target source; + [%expect {| { "character": 12, "line": 0 } |}] +;; + +let%expect_test "Jump to the previous phrase - 1" = + let source = {| let x = 10 let y = 11 |} + and line = 0 + and character = 12 + and target = `Prev in + Util.test ~line ~character ~target source; + [%expect {| { "character": 1, "line": 0 } |}] +;; + +let%expect_test "Jump to the next phrase - 2" = + let source = + {| module T = struct + let x = 10 + let y = 11 +end +let z = 10 +module R = List +|} + and line = 1 + and character = 8 + and target = `Next in + Util.test ~line ~character ~target source; + [%expect {| { "character": 4, "line": 2 } |}] +;; + +let%expect_test "Jump to the next phrase - 3" = + let source = + {| module T = struct + let x = 10 + let y = 11 +end +let z = 10 +module R = List +|} + and line = 2 + and character = 4 + and target = `Next in + Util.test ~line ~character ~target source; + [%expect {| { "character": 0, "line": 4 } |}] +;; + +let%expect_test "Jump to the next phrase - 4" = + let source = + {| module T = struct + let x = 10 + let y = 11 +end +let z = 10 +module R = List +|} + and line = 4 + and character = 0 + and target = `Next in + Util.test ~line ~character ~target source; + [%expect {| { "character": 0, "line": 5 } |}] +;; + +let%expect_test "Jump to the previous phrase - 2" = + let source = + {| module T = struct + let x = 10 + let y = 11 +end +let z = 10 +module R = List +|} + and line = 5 + and character = 0 + and target = `Prev in + Util.test ~line ~character ~target source; + [%expect {| { "character": 0, "line": 4 } |}] +;; + +let%expect_test "Jump to the previous phrase - 3" = + let source = + {| module T = struct + let x = 10 + let y = 11 +end +let z = 10 +module R = List +|} + and line = 4 + and character = 0 + and target = `Prev in + Util.test ~line ~character ~target source; + [%expect {| { "character": 1, "line": 0 } |}] +;; diff --git a/ocaml-lsp-server/test/e2e-new/start_stop.ml b/ocaml-lsp-server/test/e2e-new/start_stop.ml index f369cf4a1..65489d7e2 100644 --- a/ocaml-lsp-server/test/e2e-new/start_stop.ml +++ b/ocaml-lsp-server/test/e2e-new/start_stop.ml @@ -96,7 +96,10 @@ let%expect_test "start/stop" = "handleGetDocumentation": true, "handleConstruct": true, "handleTypeSearch": true, - "handleJump": true + "handleJump": true, + "handlePhrase": true, + "handleTypeExpression": true, + "handleLocate": true } }, "foldingRangeProvider": true, diff --git a/ocaml-lsp-server/test/e2e-new/type_expression.ml b/ocaml-lsp-server/test/e2e-new/type_expression.ml new file mode 100644 index 000000000..a58387960 --- /dev/null +++ b/ocaml-lsp-server/test/e2e-new/type_expression.ml @@ -0,0 +1,74 @@ +open Test.Import +module Req = Ocaml_lsp_server.Custom_request.Type_expression + +module Util = struct + let call_type_expr ~position ~expression client = + let text_document = + TextDocumentIdentifier.create ~uri:(DocumentUri.of_path "test.ml") + in + let params = + Req.Request_params.create ~text_document ~position ~expression + |> Req.Request_params.yojson_of_t + |> Jsonrpc.Structured.t_of_yojson + |> Option.some + in + let req = Lsp.Client_request.UnknownRequest { meth = Req.meth; params } in + Client.request client req + ;; + + let test ~line ~character ~expression source = + let position = Position.create ~line ~character in + let request client = + let open Fiber.O in + let+ response = call_type_expr ~position ~expression client in + Test.print_result response + in + Helpers.test source request + ;; +end + +let%expect_test "Type an expression - 1" = + let source = {| let x = 10 let y = 11 |} + and line = 0 + and character = 9 + and expression = {|"foo"|} in + Util.test ~line ~character ~expression source; + [%expect {| "string" |}] +;; + +let%expect_test "Type an expression - 2" = + let source = {| let x = 10 let y = function `Foo -> () | _ -> () |} + and line = 1 + and character = 0 + and expression = {|List.map|} in + Util.test ~line ~character ~expression source; + [%expect {| "('a -> 'b) -> 'a list -> 'b list" |}] +;; + +let%expect_test "Type an expression - with unbound value" = + let source = {| let x = 10 let y = function `Foo -> () | _ -> () |} + and line = 1 + and character = 0 + and expression = {|z|} in + Util.test ~line ~character ~expression source; + [%expect {| "Unbound value z" |}] +;; + +let%expect_test "Type an expression - with menhir error" = + let source = {| let x = 10 let y = function `Foo -> () | _ -> () |} + and line = 1 + and character = 0 + and expression = {|('a, ) list|} in + Util.test ~line ~character ~expression source; + [%expect {| "Ocaml_preprocess.Parser_raw.MenhirBasics.Error" |}] +;; + +let%expect_test "Type a big expression" = + let source = {| let x = 10 let y = function `Foo -> () | _ -> () |} + and line = 1 + and character = 0 + and expression = {|List|} in + Util.test ~line ~character ~expression source; + [%expect + {| "sig\n type 'a t = 'a list = [] | ( :: ) of 'a * 'a list\n\n val length : 'a list -> int\n val compare_lengths : 'a list -> 'b list -> int\n val compare_length_with : 'a list -> int -> int\n val cons : 'a -> 'a list -> 'a list\n val hd : 'a list -> 'a\n val tl : 'a list -> 'a list\n val nth : 'a list -> int -> 'a\n val nth_opt : 'a list -> int -> 'a option\n val rev : 'a list -> 'a list\n val init : int -> (int -> 'a) -> 'a list\n val append : 'a list -> 'a list -> 'a list\n val rev_append : 'a list -> 'a list -> 'a list\n val concat : 'a list list -> 'a list\n val flatten : 'a list list -> 'a list\n val equal : ('a -> 'a -> bool) -> 'a list -> 'a list -> bool\n val compare : ('a -> 'a -> int) -> 'a list -> 'a list -> int\n val iter : ('a -> unit) -> 'a list -> unit\n val iteri : (int -> 'a -> unit) -> 'a list -> unit\n val map : ('a -> 'b) -> 'a list -> 'b list\n val mapi : (int -> 'a -> 'b) -> 'a list -> 'b list\n val rev_map : ('a -> 'b) -> 'a list -> 'b list\n val filter_map : ('a -> 'b option) -> 'a list -> 'b list\n val concat_map : ('a -> 'b list) -> 'a list -> 'b list\n\n val fold_left_map :\n ('a -> 'b -> 'a * 'c) -> 'a -> 'b list -> 'a * 'c list\n\n val fold_left : ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a\n val fold_right : ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b\n val iter2 : ('a -> 'b -> unit) -> 'a list -> 'b list -> unit\n val map2 : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list\n\n val rev_map2 :\n ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list\n\n val fold_left2 :\n ('a -> 'b -> 'c -> 'a) -> 'a -> 'b list -> 'c list -> 'a\n\n val fold_right2 :\n ('a -> 'b -> 'c -> 'c) -> 'a list -> 'b list -> 'c -> 'c\n\n val for_all : ('a -> bool) -> 'a list -> bool\n val exists : ('a -> bool) -> 'a list -> bool\n\n val for_all2 :\n ('a -> 'b -> bool) -> 'a list -> 'b list -> bool\n\n val exists2 :\n ('a -> 'b -> bool) -> 'a list -> 'b list -> bool\n\n val mem : 'a -> 'a list -> bool\n val memq : 'a -> 'a list -> bool\n val find : ('a -> bool) -> 'a list -> 'a\n val find_opt : ('a -> bool) -> 'a list -> 'a option\n val find_map : ('a -> 'b option) -> 'a list -> 'b option\n val filter : ('a -> bool) -> 'a list -> 'a list\n val find_all : ('a -> bool) -> 'a list -> 'a list\n val filteri : (int -> 'a -> bool) -> 'a list -> 'a list\n val partition : ('a -> bool) -> 'a list -> 'a list * 'a list\n\n val partition_map :\n ('a -> ('b, 'c) Either.t) -> 'a list -> 'b list * 'c list\n\n val assoc : 'a -> ('a * 'b) list -> 'b\n val assoc_opt : 'a -> ('a * 'b) list -> 'b option\n val assq : 'a -> ('a * 'b) list -> 'b\n val assq_opt : 'a -> ('a * 'b) list -> 'b option\n val mem_assoc : 'a -> ('a * 'b) list -> bool\n val mem_assq : 'a -> ('a * 'b) list -> bool\n val remove_assoc : 'a -> ('a * 'b) list -> ('a * 'b) list\n val remove_assq : 'a -> ('a * 'b) list -> ('a * 'b) list\n val split : ('a * 'b) list -> 'a list * 'b list\n val combine : 'a list -> 'b list -> ('a * 'b) list\n val sort : ('a -> 'a -> int) -> 'a list -> 'a list\n val stable_sort : ('a -> 'a -> int) -> 'a list -> 'a list\n val fast_sort : ('a -> 'a -> int) -> 'a list -> 'a list\n val sort_uniq : ('a -> 'a -> int) -> 'a list -> 'a list\n\n val merge :\n ('a -> 'a -> int) -> 'a list -> 'a list -> 'a list\n\n val to_seq : 'a list -> 'a Seq.t\n val of_seq : 'a Seq.t -> 'a list\nend" |}] +;; diff --git a/ocaml-lsp-server/test/e2e-new/type_search.ml b/ocaml-lsp-server/test/e2e-new/type_search.ml index 09965385d..4d9622e1a 100644 --- a/ocaml-lsp-server/test/e2e-new/type_search.ml +++ b/ocaml-lsp-server/test/e2e-new/type_search.ml @@ -130,7 +130,8 @@ let%expect_test "cost": 4, "constructible": "string_of_int _" } - ] |}] + ] + |}] ;; let%expect_test @@ -177,7 +178,8 @@ let%expect_test "cost": 0, "constructible": "string_of_int _" } - ] |}] + ] + |}] ;; let%expect_test diff --git a/ocaml-lsp-server/test/e2e/.gitignore b/ocaml-lsp-server/test/e2e/.gitignore deleted file mode 100644 index c2658d7d1..000000000 --- a/ocaml-lsp-server/test/e2e/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/ocaml-lsp-server/test/e2e/.prettierignore b/ocaml-lsp-server/test/e2e/.prettierignore deleted file mode 100644 index c2658d7d1..000000000 --- a/ocaml-lsp-server/test/e2e/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/ diff --git a/ocaml-lsp-server/test/e2e/.prettierrc b/ocaml-lsp-server/test/e2e/.prettierrc deleted file mode 100644 index c4664cb74..000000000 --- a/ocaml-lsp-server/test/e2e/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "trailingComma": "all", - "tabWidth": 2, - "semi": true, - "singleQuote": false -} diff --git a/ocaml-lsp-server/test/e2e/__tests__/Lifecycle.test.ts b/ocaml-lsp-server/test/e2e/__tests__/Lifecycle.test.ts index f61c3f409..ca17269fc 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/Lifecycle.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/Lifecycle.test.ts @@ -1,25 +1,24 @@ import * as Protocol from "vscode-languageserver-protocol"; - import * as LanguageServer from "./../src/LanguageServer"; test("basic", async () => { - let languageServer = LanguageServer.start(); + const languageServer = LanguageServer.start(); await LanguageServer.exit(languageServer); }); test("initialize with empty capabilities", async () => { - let languageServer = LanguageServer.start(); + const languageServer = LanguageServer.start(); - let capabilities: Protocol.ClientCapabilities = {}; + const capabilities: Protocol.ClientCapabilities = {}; - let initializeParameters: Protocol.InitializeParams = { + const initializeParameters: Protocol.InitializeParams = { processId: process.pid, rootUri: LanguageServer.toURI(__dirname), capabilities: capabilities, workspaceFolders: [], }; - let result = await languageServer.sendRequest( + const result = await languageServer.sendRequest( Protocol.InitializeRequest.type, initializeParameters, ); diff --git a/ocaml-lsp-server/test/e2e/__tests__/Request.Debug.test.ts b/ocaml-lsp-server/test/e2e/__tests__/Request.Debug.test.ts index 46485a0d2..258d624d1 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/Request.Debug.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/Request.Debug.test.ts @@ -1,13 +1,13 @@ import * as LanguageServer from "./../src/LanguageServer"; test("debug/echo", async () => { - let languageServer = await LanguageServer.startAndInitialize(); + const languageServer = await LanguageServer.startAndInitialize(); - let params = { + const params = { message: "testing", }; - let result: any = await languageServer.sendRequest("debug/echo", params); + const result: any = await languageServer.sendRequest("debug/echo", params); expect(result.message).toBe("testing"); await LanguageServer.exit(languageServer); diff --git a/ocaml-lsp-server/test/e2e/__tests__/TextDocument.test.ts b/ocaml-lsp-server/test/e2e/__tests__/TextDocument.test.ts index 8cb3fd4a0..5780f580c 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/TextDocument.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/TextDocument.test.ts @@ -1,13 +1,13 @@ import outdent from "outdent"; -import * as LanguageServer from "./../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "./../src/LanguageServer"; describe("TextDocument: incremental sync", () => { let languageServer: LanguageServer.LanguageServer; async function getDoc(languageServer: LanguageServer.LanguageServer) { - let result: string = await languageServer.sendRequest( + const result: string = await languageServer.sendRequest( "debug/textDocument/get", { textDocument: Types.TextDocumentIdentifier.create( @@ -309,7 +309,7 @@ describe("TextDocument", () => { }, ); - let result: string = await languageServer.sendRequest( + const result: string = await languageServer.sendRequest( "debug/textDocument/get", { textDocument: Types.TextDocumentIdentifier.create( @@ -349,7 +349,7 @@ describe("TextDocument", () => { }, ); - let result: string = await languageServer.sendRequest( + const result: string = await languageServer.sendRequest( "debug/textDocument/get", { textDocument: Types.TextDocumentIdentifier.create( diff --git a/ocaml-lsp-server/test/e2e/__tests__/completionItem-resolve.test.ts b/ocaml-lsp-server/test/e2e/__tests__/completionItem-resolve.test.ts index 232dd86f1..e7b9f7e5a 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/completionItem-resolve.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/completionItem-resolve.test.ts @@ -1,8 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "./../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; - import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "./../src/LanguageServer"; describe("textDocument/completion", () => { let languageServer: LanguageServer.LanguageServer; @@ -49,20 +48,20 @@ describe("textDocument/completion", () => { List.ma `); - let response = await queryCompletionItemResolve( + const response = await queryCompletionItemResolve( "map2", Types.Position.create(0, 5), ); expect(response).toMatchInlineSnapshot(` - Object { - "documentation": "[map2 f [a1; ...; an] [b1; ...; bn]] is - [[f a1 b1; ...; f an bn]]. - @raise Invalid_argument if the two lists are determined - to have different lengths. Not tail-recursive.", - "label": "map2", - } - `); +{ + "documentation": "[map2 f [a1; ...; an] [b1; ...; bn]] is + [[f a1 b1; ...; f an bn]]. + @raise Invalid_argument if the two lists are determined + to have different lengths.", + "label": "map2", +} +`); }); it("can get documentation at arbitrary position", async () => { @@ -70,17 +69,17 @@ describe("textDocument/completion", () => { List.fld((=) 0) [1; 2; 3] `); - let response = await queryCompletionItemResolve( + const response = await queryCompletionItemResolve( "find_all", Types.Position.create(0, 5), ); expect(response).toMatchInlineSnapshot(` - Object { - "documentation": "[find_all] is another name for {!filter}.", - "label": "find_all", - } - `); +{ + "documentation": "[find_all] is another name for {!filter}.", + "label": "find_all", +} +`); }); it("can get documentation at arbitrary position (before dot)", async () => { @@ -97,16 +96,16 @@ describe("textDocument/completion", () => { Outer.Inner.v `); - let response = await queryCompletionItemResolve( + const response = await queryCompletionItemResolve( "Inner", Types.Position.create(9, 10), ); expect(response).toMatchInlineSnapshot(` - Object { - "documentation": "documentation for [Inner]", - "label": "Inner", - } - `); +{ + "documentation": "documentation for [Inner]", + "label": "Inner", +} +`); }); }); diff --git a/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-hoverExtended.ts b/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-hoverExtended.ts index 868f4a846..cc1dbbf52 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-hoverExtended.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-hoverExtended.ts @@ -1,7 +1,6 @@ import outdent from "outdent"; -import * as LanguageServer from "./../src/LanguageServer"; - import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "./../src/LanguageServer"; describe("ocamllsp/hoverExtended", () => { let languageServer: LanguageServer.LanguageServer; @@ -21,24 +20,24 @@ describe("ocamllsp/hoverExtended", () => { ), }); - let result = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(0, 4), verbosity: 0, }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "plaintext", "value": "int", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 5, "line": 0, }, - "start": Object { + "start": { "character": 4, "line": 0, }, @@ -68,26 +67,26 @@ Object { ), }); - let result = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(0, 4), verbosity: 0, }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml int \`\`\`", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 5, "line": 0, }, - "start": Object { + "start": { "character": 4, "line": 0, }, @@ -122,15 +121,15 @@ int ), }); - let result = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(3, 9), verbosity: 0, }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml 'a -> 'a @@ -138,12 +137,12 @@ Object { *** This function has a nice documentation", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 11, "line": 3, }, - "start": Object { + "start": { "character": 9, "line": 3, }, @@ -198,15 +197,15 @@ This function has a nice documentation", ), }); - let result = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(23, 10), verbosity: 0, }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml int -> int -> int @@ -227,7 +226,7 @@ dividend ***@raise*** \`Division_by_zero\` raised when divided by zero -***@see*** [link](https://en.wikipedia.org/wiki/Arithmetic#Division_\\\\(%C3%B7,_or_/\\\\)) +***@see*** [link](https://en.wikipedia.org/wiki/Arithmetic#Division_\\(%C3%B7,_or_/\\)) article ***@see*** \`arithmetic.ml\` @@ -244,12 +243,12 @@ use \`(/)\` ***@author*** John Doe", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 11, "line": 23, }, - "start": Object { + "start": { "character": 8, "line": 23, }, @@ -284,26 +283,26 @@ use \`(/)\` ), }); - let result = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(3, 13), verbosity: 0, }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml int \`\`\`", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 13, "line": 3, }, - "start": Object { + "start": { "character": 12, "line": 3, }, @@ -337,59 +336,59 @@ int ), }); - let hover1 = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const hover1 = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(1, 4), verbosity: 0, }); expect(hover1).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "markdown", - "value": "\`\`\`ocaml - type s = t - \`\`\`", - }, - "range": Object { - "end": Object { - "character": 14, - "line": 1, - }, - "start": Object { - "character": 0, - "line": 1, - }, - }, - } - `); +{ + "contents": { + "kind": "markdown", + "value": "\`\`\`ocaml +type s = t +\`\`\`", + }, + "range": { + "end": { + "character": 14, + "line": 1, + }, + "start": { + "character": 0, + "line": 1, + }, + }, +} +`); - let hover2 = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const hover2 = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(2, 9), verbosity: 0, }); expect(hover2).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "markdown", - "value": "\`\`\`ocaml - type 'a fib = ('a -> unit) -> unit - \`\`\`", - }, - "range": Object { - "end": Object { - "character": 34, - "line": 2, - }, - "start": Object { - "character": 0, - "line": 2, - }, - }, - } - `); +{ + "contents": { + "kind": "markdown", + "value": "\`\`\`ocaml +type 'a fib = ('a -> unit) -> unit +\`\`\`", + }, + "range": { + "end": { + "character": 34, + "line": 2, + }, + "start": { + "character": 0, + "line": 2, + }, + }, +} +`); }); it("regression test for #403", async () => { @@ -407,30 +406,30 @@ let x : foo = 1 ), }); - let result = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(2, 4), verbosity: 0, }); expect(result).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "plaintext", - "value": "foo", - }, - "range": Object { - "end": Object { - "character": 5, - "line": 2, - }, - "start": Object { - "character": 4, - "line": 2, - }, - }, - } - `); +{ + "contents": { + "kind": "plaintext", + "value": "foo", + }, + "range": { + "end": { + "character": 5, + "line": 2, + }, + "start": { + "character": 4, + "line": 2, + }, + }, +} +`); }); it("FIXME: reproduce [#344](https://github.com/ocaml/ocaml-lsp/issues/344)", async () => { @@ -484,7 +483,7 @@ let x : foo = 1 }); // here we see that all is ok - let hoverOverK = await languageServer.sendRequest( + const hoverOverK = await languageServer.sendRequest( "ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), @@ -494,28 +493,28 @@ let x : foo = 1 ); expect(hoverOverK).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "markdown", - "value": "\`\`\`ocaml - unit - \`\`\`", - }, - "range": Object { - "end": Object { - "character": 5, - "line": 24, - }, - "start": Object { - "character": 4, - "line": 24, - }, - }, - } - `); +{ + "contents": { + "kind": "markdown", + "value": "\`\`\`ocaml +unit +\`\`\`", + }, + "range": { + "end": { + "character": 5, + "line": 24, + }, + "start": { + "character": 4, + "line": 24, + }, + }, +} +`); // we trigger the bug - let autocompleteForListm = await languageServer.sendRequest( + const autocompleteForListm = await languageServer.sendRequest( "ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), @@ -524,7 +523,7 @@ let x : foo = 1 }, ); - let buggedHoverOverK = await languageServer.sendRequest( + const buggedHoverOverK = await languageServer.sendRequest( "ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), @@ -535,25 +534,25 @@ let x : foo = 1 // now the same hover as before comes with unrelated documentation expect(buggedHoverOverK).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "markdown", - "value": "\`\`\`ocaml - unit - \`\`\`", - }, - "range": Object { - "end": Object { - "character": 5, - "line": 24, - }, - "start": Object { - "character": 4, - "line": 24, - }, - }, - } - `); +{ + "contents": { + "kind": "markdown", + "value": "\`\`\`ocaml +unit +\`\`\`", + }, + "range": { + "end": { + "character": 5, + "line": 24, + }, + "start": { + "character": 4, + "line": 24, + }, + }, +} +`); }); it("supports explicity verbosity", async () => { @@ -571,80 +570,80 @@ let x : foo = Some 1 ), }); - let result0 = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result0 = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(2, 4), verbosity: 0, }); expect(result0).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "plaintext", - "value": "foo", - }, - "range": Object { - "end": Object { - "character": 5, - "line": 2, - }, - "start": Object { - "character": 4, - "line": 2, - }, - }, - } - `); +{ + "contents": { + "kind": "plaintext", + "value": "foo", + }, + "range": { + "end": { + "character": 5, + "line": 2, + }, + "start": { + "character": 4, + "line": 2, + }, + }, +} +`); - let result1 = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result1 = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(2, 4), verbosity: 1, }); expect(result1).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "plaintext", - "value": "int option", - }, - "range": Object { - "end": Object { - "character": 5, - "line": 2, - }, - "start": Object { - "character": 4, - "line": 2, - }, - }, - } - `); +{ + "contents": { + "kind": "plaintext", + "value": "int option", + }, + "range": { + "end": { + "character": 5, + "line": 2, + }, + "start": { + "character": 4, + "line": 2, + }, + }, +} +`); - let result2 = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result2 = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(2, 4), verbosity: 2, }); expect(result2).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "plaintext", - "value": "int option", - }, - "range": Object { - "end": Object { - "character": 5, - "line": 2, - }, - "start": Object { - "character": 4, - "line": 2, - }, - }, - } - `); +{ + "contents": { + "kind": "plaintext", + "value": "int option", + }, + "range": { + "end": { + "character": 5, + "line": 2, + }, + "start": { + "character": 4, + "line": 2, + }, + }, +} +`); }); it("supports implicit verbosity", async () => { @@ -662,76 +661,76 @@ let x : foo = Some 1 ), }); - let result0 = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result0 = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(2, 4), }); expect(result0).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "plaintext", - "value": "foo", - }, - "range": Object { - "end": Object { - "character": 5, - "line": 2, - }, - "start": Object { - "character": 4, - "line": 2, - }, - }, - } - `); +{ + "contents": { + "kind": "plaintext", + "value": "foo", + }, + "range": { + "end": { + "character": 5, + "line": 2, + }, + "start": { + "character": 4, + "line": 2, + }, + }, +} +`); - let result1 = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result1 = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(2, 4), }); expect(result1).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "plaintext", - "value": "int option", - }, - "range": Object { - "end": Object { - "character": 5, - "line": 2, - }, - "start": Object { - "character": 4, - "line": 2, - }, - }, - } - `); +{ + "contents": { + "kind": "plaintext", + "value": "int option", + }, + "range": { + "end": { + "character": 5, + "line": 2, + }, + "start": { + "character": 4, + "line": 2, + }, + }, +} +`); - let result2 = await languageServer.sendRequest("ocamllsp/hoverExtended", { + const result2 = await languageServer.sendRequest("ocamllsp/hoverExtended", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(2, 4), }); expect(result2).toMatchInlineSnapshot(` - Object { - "contents": Object { - "kind": "plaintext", - "value": "int option", - }, - "range": Object { - "end": Object { - "character": 5, - "line": 2, - }, - "start": Object { - "character": 4, - "line": 2, - }, - }, - } - `); +{ + "contents": { + "kind": "plaintext", + "value": "int option", + }, + "range": { + "end": { + "character": 5, + "line": 2, + }, + "start": { + "character": 4, + "line": 2, + }, + }, +} +`); }); }); diff --git a/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-inferIntf.ts b/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-inferIntf.ts index d102df3c8..99e8e3209 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-inferIntf.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-inferIntf.ts @@ -1,8 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; - import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("ocamllsp/inferIntf", () => { let languageServer: LanguageServer.LanguageServer; @@ -45,7 +44,7 @@ let f (x : t) = x `, "test.ml", ); - let actions = await inferIntf("test.ml"); + const actions = await inferIntf("test.ml"); expect(actions).toEqual( "type t = Foo of int | Bar of bool\nval f : t -> t\n", ); diff --git a/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-switchImplIntf.ts b/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-switchImplIntf.ts index 855f8e9e7..7602eaedb 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-switchImplIntf.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-switchImplIntf.ts @@ -1,10 +1,13 @@ -import { assert } from "console"; -import { promises as fs } from "fs"; -import * as path from "path"; -import { DocumentUri, TextDocumentItem } from "vscode-languageserver-types"; +import { assert } from "node:console"; +import { promises as fs } from "node:fs"; +import * as path from "node:path"; +import * as Protocol from "vscode-languageserver-protocol"; +import { + type DocumentUri, + TextDocumentItem, +} from "vscode-languageserver-types"; import { URI } from "vscode-uri"; import * as LanguageServer from "./../src/LanguageServer"; -import * as Protocol from "vscode-languageserver-protocol"; describe("ocamllsp/switchImplIntf", () => { let languageServer: LanguageServer.LanguageServer; @@ -25,7 +28,7 @@ describe("ocamllsp/switchImplIntf", () => { return languageServer.sendRequest("ocamllsp/switchImplIntf", documentUri); } - let testWorkspacePath = path.join(__dirname, "..", "test_files/"); + const testWorkspacePath = path.join(__dirname, "..", "test_files/"); beforeEach(async () => { languageServer = await LanguageServer.startAndInitialize(); @@ -37,22 +40,22 @@ describe("ocamllsp/switchImplIntf", () => { await LanguageServer.exit(languageServer); }); - let createPathForFile = (filename: string) => + const createPathForFile = (filename: string) => path.join(testWorkspacePath, filename); - let createFileAtPath = (path: string) => + const createFileAtPath = (path: string) => fs.writeFile(path, "", { flag: "a+" }); - let pathToDocumentUri = (path: string): DocumentUri => + const pathToDocumentUri = (path: string): DocumentUri => URI.file(path).toString(); - let [mli, ml, mll, mly, rei, re] = ["mli", "ml", "mll", "mly", "rei", "re"]; + const [mli, ml, mll, mly, rei, re] = ["mli", "ml", "mll", "mly", "rei", "re"]; - let testRequest = async ( + const testRequest = async ( requestParam: DocumentUri, expectedResponse: DocumentUri[], ) => { - let response = await ocamllspSwitchImplIntf(requestParam); + const response = await ocamllspSwitchImplIntf(requestParam); expect(response).toEqual(expectedResponse); }; @@ -65,7 +68,7 @@ describe("ocamllsp/switchImplIntf", () => { * @param extExpected file name extensions that are expected to be returned as * a reponse to 'ocamllsp/switchImplIntf' */ - let testingPipeline = async ( + const testingPipeline = async ( extsForCreation: string[], extExpected: string[], ) => { @@ -78,20 +81,20 @@ describe("ocamllsp/switchImplIntf", () => { "expected response extensions should not be empty", ); - let filePathsForCreation = extsForCreation.map((ext) => { - let filename = "test.".concat(ext); + const filePathsForCreation = extsForCreation.map((ext) => { + const filename = "test.".concat(ext); return createPathForFile(filename); }); await Promise.all(filePathsForCreation.map(createFileAtPath)); - let filePathToSwitchFrom = filePathsForCreation[0]; - let fileURIToSwitchFrom = pathToDocumentUri(filePathToSwitchFrom); + const filePathToSwitchFrom = filePathsForCreation[0]; + const fileURIToSwitchFrom = pathToDocumentUri(filePathToSwitchFrom); await openDocument(fileURIToSwitchFrom); - let expectedFileURIs = extExpected.map((ext) => { - let filename = "test.".concat(ext); - let filePath = createPathForFile(filename); + const expectedFileURIs = extExpected.map((ext) => { + const filename = "test.".concat(ext); + const filePath = createPathForFile(filename); return pathToDocumentUri(filePath); }); @@ -99,10 +102,10 @@ describe("ocamllsp/switchImplIntf", () => { }; /* `create`, `expect`, and `test_case` are for declarativeness */ - let varargFn = (...args: T[]): T[] => args; - let createFiles = varargFn; - let expectSwitchTo = varargFn; - let testCase = (filesToCreate: string[], filesToExpect: string[]) => [ + const varargFn = (...args: T[]): T[] => args; + const createFiles = varargFn; + const expectSwitchTo = varargFn; + const testCase = (filesToCreate: string[], filesToExpect: string[]) => [ filesToCreate, filesToExpect, ]; @@ -117,13 +120,13 @@ describe("ocamllsp/switchImplIntf", () => { ])("test switches (%s => %s)", testingPipeline); it("can switch from file URI with non-file scheme", async () => { - let mlFpath = createPathForFile("test.ml"); + const mlFpath = createPathForFile("test.ml"); await createFileAtPath(mlFpath); - let mlUri = pathToDocumentUri(mlFpath); + const mlUri = pathToDocumentUri(mlFpath); - let newMliFpath = createPathForFile("test.mli"); + const newMliFpath = createPathForFile("test.mli"); await createFileAtPath(newMliFpath); - let mliUriUntitledScheme: DocumentUri = URI.file(newMliFpath) + const mliUriUntitledScheme: DocumentUri = URI.file(newMliFpath) .with({ scheme: "untitled", }) diff --git a/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-typedHoles.ts b/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-typedHoles.ts index 615a5adf0..7d0207bc3 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-typedHoles.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-typedHoles.ts @@ -1,7 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("ocamllsp/typedHoles", () => { let languageServer: LanguageServer.LanguageServer; @@ -41,8 +41,8 @@ let u = 1 `, ); - let r = await sendTypedHolesReq(); - expect(r).toMatchInlineSnapshot(`Array []`); + const r = await sendTypedHolesReq(); + expect(r).toMatchInlineSnapshot("[]"); }); it("one hole", async () => { @@ -52,21 +52,21 @@ let k = match () with () -> _ `, ); - let r = await sendTypedHolesReq(); + const r = await sendTypedHolesReq(); expect(r).toMatchInlineSnapshot(` - Array [ - Object { - "end": Object { - "character": 29, - "line": 0, - }, - "start": Object { - "character": 28, - "line": 0, - }, - }, - ] - `); +[ + { + "end": { + "character": 29, + "line": 0, + }, + "start": { + "character": 28, + "line": 0, + }, + }, +] +`); }); it("several holes", async () => { @@ -78,40 +78,40 @@ let u = () `, ); - let r = await sendTypedHolesReq(); + const r = await sendTypedHolesReq(); expect(r).toMatchInlineSnapshot(` - Array [ - Object { - "end": Object { - "character": 31, - "line": 2, - }, - "start": Object { - "character": 30, - "line": 2, - }, - }, - Object { - "end": Object { - "character": 37, - "line": 1, - }, - "start": Object { - "character": 36, - "line": 1, - }, - }, - Object { - "end": Object { - "character": 49, - "line": 1, - }, - "start": Object { - "character": 48, - "line": 1, - }, - }, - ] - `); +[ + { + "end": { + "character": 31, + "line": 2, + }, + "start": { + "character": 30, + "line": 2, + }, + }, + { + "end": { + "character": 37, + "line": 1, + }, + "start": { + "character": 36, + "line": 1, + }, + }, + { + "end": { + "character": 49, + "line": 1, + }, + "start": { + "character": 48, + "line": 1, + }, + }, +] +`); }); }); diff --git a/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-wrappingAstNode.test.ts b/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-wrappingAstNode.test.ts index 61450bc09..6db580536 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-wrappingAstNode.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/ocamllsp-wrappingAstNode.test.ts @@ -1,8 +1,8 @@ import outdent from "outdent"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; import { Position } from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("ocamllsp/wrappingAstNode", () => { let languageServer: LanguageServer.LanguageServer; @@ -48,11 +48,11 @@ describe("ocamllsp/wrappingAstNode", () => { `, ); - let r = await sendWrappingAstNodeRequest({ line: 0, character: 0 }); - expect(r).toMatchInlineSnapshot(`null`); + const r = await sendWrappingAstNodeRequest({ line: 0, character: 0 }); + expect(r).toMatchInlineSnapshot("null"); }); - let code_snippet_0 = outdent` + const code_snippet_0 = outdent` let k = 1 module M = struct @@ -67,51 +67,51 @@ end it("when on a toplevel let binding", async () => { openDocument(code_snippet_0); - let r = await sendWrappingAstNodeRequest({ line: 0, character: 5 }); + const r = await sendWrappingAstNodeRequest({ line: 0, character: 5 }); /* given range corresponds to: let k = 1 */ expect(r).toMatchInlineSnapshot(` - Object { - "end": Object { - "character": 9, - "line": 0, - }, - "start": Object { - "character": 0, - "line": 0, - }, - } - `); +{ + "end": { + "character": 9, + "line": 0, + }, + "start": { + "character": 0, + "line": 0, + }, +} +`); }); it("in between toplevel bindings (let and module def)", async () => { openDocument(code_snippet_0); - let r = await sendWrappingAstNodeRequest({ line: 1, character: 0 }); + const r = await sendWrappingAstNodeRequest({ line: 1, character: 0 }); /* given range corresponds to: whole `code_snippet_0` */ expect(r).toMatchInlineSnapshot(` - Object { - "end": Object { - "character": 3, - "line": 8, - }, - "start": Object { - "character": 0, - "line": 0, - }, - } - `); +{ + "end": { + "character": 3, + "line": 8, + }, + "start": { + "character": 0, + "line": 0, + }, +} +`); }); it("on keyword struct", async () => { openDocument(code_snippet_0); - let r = await sendWrappingAstNodeRequest({ line: 2, character: 14 }); + const r = await sendWrappingAstNodeRequest({ line: 2, character: 14 }); /* given range corresponds to: the whole module definition M module M = struct @@ -123,22 +123,22 @@ end end */ expect(r).toMatchInlineSnapshot(` - Object { - "end": Object { - "character": 3, - "line": 8, - }, - "start": Object { - "character": 0, - "line": 2, - }, - } - `); +{ + "end": { + "character": 3, + "line": 8, + }, + "start": { + "character": 0, + "line": 2, + }, +} +`); }); it("on `b`'s let-binding (nested let-binding in a module def)", async () => { openDocument(code_snippet_0); - let r = await sendWrappingAstNodeRequest({ line: 4, character: 10 }); + const r = await sendWrappingAstNodeRequest({ line: 4, character: 10 }); /* given range corresponds to: let a = @@ -146,23 +146,23 @@ end b + 1 */ expect(r).toMatchInlineSnapshot(` - Object { - "end": Object { - "character": 9, - "line": 5, - }, - "start": Object { - "character": 2, - "line": 3, - }, - } - `); +{ + "end": { + "character": 9, + "line": 5, + }, + "start": { + "character": 2, + "line": 3, + }, +} +`); }); it("between `a`'s and `c`'s let-bindings in a module def", async () => { openDocument(code_snippet_0); - let r = await sendWrappingAstNodeRequest({ line: 6, character: 0 }); + const r = await sendWrappingAstNodeRequest({ line: 6, character: 0 }); /* given range corresponds to: values in M, but not module binding itself let a = @@ -172,16 +172,16 @@ end let c = 2 */ expect(r).toMatchInlineSnapshot(` - Object { - "end": Object { - "character": 11, - "line": 7, - }, - "start": Object { - "character": 2, - "line": 3, - }, - } - `); +{ + "end": { + "character": 11, + "line": 7, + }, + "start": { + "character": 2, + "line": 3, + }, +} +`); }); }); diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-codeAction.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-codeAction.test.ts index 7e15819cd..4e59df007 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-codeAction.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-codeAction.test.ts @@ -1,32 +1,33 @@ +import * as path from "node:path"; import outdent from "outdent"; -import * as path from "path"; -import { URI } from "vscode-uri"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; import { Position } from "vscode-languageserver-types"; +import { URI } from "vscode-uri"; +import * as LanguageServer from "../src/LanguageServer"; function findAddRecAnnotation(actions: Types.CodeAction[]) { return actions.find( (action) => - action.kind == "quickfix" && action.title == "Add missing `rec` keyword", + action.kind === "quickfix" && + action.title === "Add missing `rec` keyword", ); } function findMarkUnused(actions: Types.CodeAction[]) { return actions.find( - (action) => action.kind == "quickfix" && action.title == "Mark as unused", + (action) => action.kind === "quickfix" && action.title === "Mark as unused", ); } function findRemoveUnused(actions: Types.CodeAction[]) { return actions.find( - (action) => action.kind == "quickfix" && action.title == "Remove unused", + (action) => action.kind === "quickfix" && action.title === "Remove unused", ); } function findInferredAction(actions: Types.CodeAction[]) { - return actions.find((action) => action.kind == "inferred_intf"); + return actions.find((action) => action.kind === "inferred_intf"); } function mkUnboundDiagnostic(start: Types.Position, end: Types.Position) { @@ -80,7 +81,7 @@ describe("textDocument/codeAction", () => { end: Position, context?: Types.CodeActionContext, ): Promise | null> { - if (typeof context == "undefined") { + if (typeof context === "undefined") { context = { diagnostics: [] }; } return languageServer.sendRequest("textDocument/codeAction", { @@ -91,41 +92,41 @@ describe("textDocument/codeAction", () => { } it("opens the implementation if not in store", async () => { - let testWorkspacePath = path.join(__dirname, "declaration_files/"); - let intfFilepath = path.join(testWorkspacePath, "lib.mli"); - let intfUri = URI.file(intfFilepath).toString(); + const testWorkspacePath = path.join(__dirname, "declaration_files/"); + const intfFilepath = path.join(testWorkspacePath, "lib.mli"); + const intfUri = URI.file(intfFilepath).toString(); openDocument("", intfUri); - let start = Types.Position.create(0, 0); - let end = Types.Position.create(0, 0); - let actions = (await codeAction(intfUri, start, end)) ?? []; + const start = Types.Position.create(0, 0); + const end = Types.Position.create(0, 0); + const actions = (await codeAction(intfUri, start, end)) ?? []; expect( findInferredAction(actions)?.edit?.documentChanges?.map((a) => Types.TextDocumentEdit.is(a) ? a.edits : null, ), ).toMatchInlineSnapshot(` - Array [ - Array [ - Object { - "newText": "val x : int - ", - "range": Object { - "end": Object { - "character": 0, - "line": 0, - }, - "start": Object { - "character": 0, - "line": 0, - }, - }, - }, - ], - ] - `); +[ + [ + { + "newText": "val x : int +", + "range": { + "end": { + "character": 0, + "line": 0, + }, + "start": { + "character": 0, + "line": 0, + }, + }, + }, + ], +] +`); }); it("offers `Construct an expression` code action", async () => { - let uri = "file:///test.ml"; + const uri = "file:///test.ml"; openDocument( outdent` let x = _ @@ -133,176 +134,176 @@ let x = _ uri, ); - let actions = + const actions = (await codeAction(uri, Position.create(0, 8), Position.create(0, 9))) ?? []; expect(actions).toMatchInlineSnapshot(` - Array [ - Object { - "edit": Object { - "documentChanges": Array [ - Object { - "edits": Array [ - Object { - "newText": "(_ : 'a)", - "range": Object { - "end": Object { - "character": 9, - "line": 0, - }, - "start": Object { - "character": 8, - "line": 0, - }, - }, - }, - ], - "textDocument": Object { - "uri": "file:///test.ml", - "version": 0, +[ + { + "edit": { + "documentChanges": [ + { + "edits": [ + { + "newText": "(_ : 'a)", + "range": { + "end": { + "character": 9, + "line": 0, + }, + "start": { + "character": 8, + "line": 0, }, }, - ], - }, - "isPreferred": false, - "kind": "type-annotate", - "title": "Type-annotate", - }, - Object { - "command": Object { - "command": "editor.action.triggerSuggest", - "title": "Trigger Suggest", + }, + ], + "textDocument": { + "uri": "file:///test.ml", + "version": 0, }, - "kind": "construct", - "title": "Construct an expression", }, - Object { - "edit": Object { - "documentChanges": Array [ - Object { - "edits": Array [ - Object { - "newText": "let var_name = _ in - ", - "range": Object { - "end": Object { - "character": 8, - "line": 0, - }, - "start": Object { - "character": 8, - "line": 0, - }, - }, - }, - Object { - "newText": "var_name", - "range": Object { - "end": Object { - "character": 9, - "line": 0, - }, - "start": Object { - "character": 8, - "line": 0, - }, - }, - }, - ], - "textDocument": Object { - "uri": "file:///test.ml", - "version": 0, + ], + }, + "isPreferred": false, + "kind": "type-annotate", + "title": "Type-annotate", + }, + { + "command": { + "command": "editor.action.triggerSuggest", + "title": "Trigger Suggest", + }, + "kind": "construct", + "title": "Construct an expression", + }, + { + "edit": { + "documentChanges": [ + { + "edits": [ + { + "newText": "let var_name = _ in +", + "range": { + "end": { + "character": 8, + "line": 0, + }, + "start": { + "character": 8, + "line": 0, }, }, - ], - }, - "isPreferred": false, - "kind": "refactor.extract", - "title": "Extract local", - }, - Object { - "edit": Object { - "documentChanges": Array [ - Object { - "edits": Array [ - Object { - "newText": "let fun_name () = _ - - ", - "range": Object { - "end": Object { - "character": 0, - "line": 0, - }, - "start": Object { - "character": 0, - "line": 0, - }, - }, - }, - Object { - "newText": "fun_name ()", - "range": Object { - "end": Object { - "character": 9, - "line": 0, - }, - "start": Object { - "character": 8, - "line": 0, - }, - }, - }, - ], - "textDocument": Object { - "uri": "file:///test.ml", - "version": 0, + }, + { + "newText": "var_name", + "range": { + "end": { + "character": 9, + "line": 0, + }, + "start": { + "character": 8, + "line": 0, }, }, - ], + }, + ], + "textDocument": { + "uri": "file:///test.ml", + "version": 0, }, - "isPreferred": false, - "kind": "refactor.extract", - "title": "Extract function", }, - Object { - "command": Object { - "arguments": Array [ - "file:///test.mli", - ], - "command": "ocamllsp/open-related-source", - "title": "Create test.mli", - }, - "edit": Object { - "documentChanges": Array [ - Object { - "kind": "create", - "uri": "file:///test.mli", + ], + }, + "isPreferred": false, + "kind": "refactor.extract", + "title": "Extract local", + }, + { + "edit": { + "documentChanges": [ + { + "edits": [ + { + "newText": "let fun_name () = _ + +", + "range": { + "end": { + "character": 0, + "line": 0, + }, + "start": { + "character": 0, + "line": 0, + }, }, - ], + }, + { + "newText": "fun_name ()", + "range": { + "end": { + "character": 9, + "line": 0, + }, + "start": { + "character": 8, + "line": 0, + }, + }, + }, + ], + "textDocument": { + "uri": "file:///test.ml", + "version": 0, }, - "kind": "switch", - "title": "Create test.mli", }, - ] - `); - - let construct_actions = actions.find( + ], + }, + "isPreferred": false, + "kind": "refactor.extract", + "title": "Extract function", + }, + { + "command": { + "arguments": [ + "file:///test.mli", + ], + "command": "ocamllsp/open-related-source", + "title": "Create test.mli", + }, + "edit": { + "documentChanges": [ + { + "kind": "create", + "uri": "file:///test.mli", + }, + ], + }, + "kind": "switch", + "title": "Create test.mli", + }, +] +`); + + const construct_actions = actions.find( (codeAction: Types.CodeAction) => codeAction.kind && codeAction.kind === "construct", ); expect(construct_actions).toMatchInlineSnapshot(` - Object { - "command": Object { - "command": "editor.action.triggerSuggest", - "title": "Trigger Suggest", - }, - "kind": "construct", - "title": "Construct an expression", - } - `); +{ + "command": { + "command": "editor.action.triggerSuggest", + "title": "Trigger Suggest", + }, + "kind": "construct", + "title": "Construct an expression", +} +`); }); type refactorOpenTestSpec = { @@ -328,10 +329,10 @@ let x = _ openDocument(documentText, documentUri); - let codeActions = + const codeActions = (await codeAction(documentUri, queryStartPos, queryEndPos)) ?? []; - let specificCodeActions = codeActions.filter( + const specificCodeActions = codeActions.filter( (codeAction: Types.CodeAction) => codeAction.title === codeActionTitle, ); @@ -339,7 +340,7 @@ let x = _ } it("refactor-open unqualify in-file module", async () => { - let specificCodeActions = await testRefactorOpen({ + const specificCodeActions = await testRefactorOpen({ documentText: outdent` module M = struct let a = 1 @@ -356,50 +357,50 @@ let x = _ }); expect(specificCodeActions).toMatchInlineSnapshot(` - Array [ - Object { - "edit": Object { - "changes": Object { - "file:///test.ml": Array [ - Object { - "newText": "f", - "range": Object { - "end": Object { - "character": 11, - "line": 7, - }, - "start": Object { - "character": 8, - "line": 7, - }, - }, - }, - Object { - "newText": "a", - "range": Object { - "end": Object { - "character": 15, - "line": 7, - }, - "start": Object { - "character": 12, - "line": 7, - }, - }, - }, - ], +[ + { + "edit": { + "changes": { + "file:///test.ml": [ + { + "newText": "f", + "range": { + "end": { + "character": 11, + "line": 7, + }, + "start": { + "character": 8, + "line": 7, + }, }, }, - "isPreferred": false, - "kind": "remove module name from identifiers", - "title": "Remove module name from identifiers", - }, - ] - `); + { + "newText": "a", + "range": { + "end": { + "character": 15, + "line": 7, + }, + "start": { + "character": 12, + "line": 7, + }, + }, + }, + ], + }, + }, + "isPreferred": false, + "kind": "remove module name from identifiers", + "title": "Remove module name from identifiers", + }, +] +`); }); it("refactor-open qualify in-file module", async () => { - let specificCodeActions = await testRefactorOpen({ + const specificCodeActions = await testRefactorOpen({ documentText: outdent` module M = struct let a = 1 @@ -416,59 +417,59 @@ let x = _ }); expect(specificCodeActions).toMatchInlineSnapshot(` - Array [ - Object { - "edit": Object { - "changes": Object { - "file:///test.ml": Array [ - Object { - "newText": "M.f", - "range": Object { - "end": Object { - "character": 9, - "line": 7, - }, - "start": Object { - "character": 8, - "line": 7, - }, - }, - }, - Object { - "newText": "M.a", - "range": Object { - "end": Object { - "character": 11, - "line": 7, - }, - "start": Object { - "character": 10, - "line": 7, - }, - }, - }, - ], +[ + { + "edit": { + "changes": { + "file:///test.ml": [ + { + "newText": "M.f", + "range": { + "end": { + "character": 9, + "line": 7, + }, + "start": { + "character": 8, + "line": 7, + }, }, }, - "isPreferred": false, - "kind": "put module name in identifiers", - "title": "Put module name in identifiers", - }, - ] - `); + { + "newText": "M.a", + "range": { + "end": { + "character": 11, + "line": 7, + }, + "start": { + "character": 10, + "line": 7, + }, + }, + }, + ], + }, + }, + "isPreferred": false, + "kind": "put module name in identifiers", + "title": "Put module name in identifiers", + }, +] +`); }); it("add missing rec in toplevel let", async () => { - let uri = "file:///missing-rec-1.ml"; + const uri = "file:///missing-rec-1.ml"; openDocument( outdent` let needs_rec x = 1 + (needs_rec x) `, uri, ); - let start = Types.Position.create(0, 31); - let end = Types.Position.create(0, 32); - let context = { + const start = Types.Position.create(0, 31); + const end = Types.Position.create(0, 32); + const context = { diagnostics: [ mkUnboundDiagnostic( Types.Position.create(0, 23), @@ -477,60 +478,60 @@ let needs_rec x = 1 + (needs_rec x) ], }; - let actions = (await codeAction(uri, start, end, context)) ?? []; + const actions = (await codeAction(uri, start, end, context)) ?? []; expect(findAddRecAnnotation(actions)).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "message": "Unbound value", - "range": Object { - "end": Object { - "character": 32, +{ + "diagnostics": [ + { + "message": "Unbound value", + "range": { + "end": { + "character": 32, + "line": 0, + }, + "start": { + "character": 23, + "line": 0, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + ], + "edit": { + "documentChanges": [ + { + "edits": [ + { + "newText": "rec ", + "range": { + "end": { + "character": 4, "line": 0, }, - "start": Object { - "character": 23, + "start": { + "character": 4, "line": 0, }, }, - "severity": 1, - "source": "ocamllsp", }, ], - "edit": Object { - "documentChanges": Array [ - Object { - "edits": Array [ - Object { - "newText": "rec ", - "range": Object { - "end": Object { - "character": 4, - "line": 0, - }, - "start": Object { - "character": 4, - "line": 0, - }, - }, - }, - ], - "textDocument": Object { - "uri": "file:///missing-rec-1.ml", - "version": 0, - }, - }, - ], + "textDocument": { + "uri": "file:///missing-rec-1.ml", + "version": 0, }, - "isPreferred": false, - "kind": "quickfix", - "title": "Add missing \`rec\` keyword", - } - `); + }, + ], + }, + "isPreferred": false, + "kind": "quickfix", + "title": "Add missing \`rec\` keyword", +} +`); }); it("add missing rec in expression let", async () => { - let uri = "file:///missing-rec-2.ml"; + const uri = "file:///missing-rec-2.ml"; openDocument( outdent` let outer = @@ -539,9 +540,9 @@ let outer = `, uri, ); - let start = Types.Position.create(2, 14); - let end = Types.Position.create(2, 15); - let context = { + const start = Types.Position.create(2, 14); + const end = Types.Position.create(2, 15); + const context = { diagnostics: [ mkUnboundDiagnostic( Types.Position.create(2, 9), @@ -550,60 +551,60 @@ let outer = ], }; - let actions = (await codeAction(uri, start, end, context)) ?? []; + const actions = (await codeAction(uri, start, end, context)) ?? []; expect(findAddRecAnnotation(actions)).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "message": "Unbound value", - "range": Object { - "end": Object { - "character": 14, - "line": 2, +{ + "diagnostics": [ + { + "message": "Unbound value", + "range": { + "end": { + "character": 14, + "line": 2, + }, + "start": { + "character": 9, + "line": 2, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + ], + "edit": { + "documentChanges": [ + { + "edits": [ + { + "newText": "rec ", + "range": { + "end": { + "character": 6, + "line": 1, }, - "start": Object { - "character": 9, - "line": 2, + "start": { + "character": 6, + "line": 1, }, }, - "severity": 1, - "source": "ocamllsp", }, ], - "edit": Object { - "documentChanges": Array [ - Object { - "edits": Array [ - Object { - "newText": "rec ", - "range": Object { - "end": Object { - "character": 6, - "line": 1, - }, - "start": Object { - "character": 6, - "line": 1, - }, - }, - }, - ], - "textDocument": Object { - "uri": "file:///missing-rec-2.ml", - "version": 0, - }, - }, - ], + "textDocument": { + "uri": "file:///missing-rec-2.ml", + "version": 0, }, - "isPreferred": false, - "kind": "quickfix", - "title": "Add missing \`rec\` keyword", - } - `); + }, + ], + }, + "isPreferred": false, + "kind": "quickfix", + "title": "Add missing \`rec\` keyword", +} +`); }); it("add missing rec in expression let-and", async () => { - let uri = "file:///missing-rec-3.ml"; + const uri = "file:///missing-rec-3.ml"; openDocument( outdent` let outer = @@ -613,9 +614,9 @@ let outer = `, uri, ); - let start = Types.Position.create(3, 14); - let end = Types.Position.create(3, 15); - let context = { + const start = Types.Position.create(3, 14); + const end = Types.Position.create(3, 15); + const context = { diagnostics: [ mkUnboundDiagnostic( Types.Position.create(3, 9), @@ -624,60 +625,60 @@ let outer = ], }; - let actions = (await codeAction(uri, start, end, context)) ?? []; + const actions = (await codeAction(uri, start, end, context)) ?? []; expect(findAddRecAnnotation(actions)).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "message": "Unbound value", - "range": Object { - "end": Object { - "character": 14, - "line": 3, +{ + "diagnostics": [ + { + "message": "Unbound value", + "range": { + "end": { + "character": 14, + "line": 3, + }, + "start": { + "character": 9, + "line": 3, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + ], + "edit": { + "documentChanges": [ + { + "edits": [ + { + "newText": "rec ", + "range": { + "end": { + "character": 6, + "line": 1, }, - "start": Object { - "character": 9, - "line": 3, + "start": { + "character": 6, + "line": 1, }, }, - "severity": 1, - "source": "ocamllsp", }, ], - "edit": Object { - "documentChanges": Array [ - Object { - "edits": Array [ - Object { - "newText": "rec ", - "range": Object { - "end": Object { - "character": 6, - "line": 1, - }, - "start": Object { - "character": 6, - "line": 1, - }, - }, - }, - ], - "textDocument": Object { - "uri": "file:///missing-rec-3.ml", - "version": 0, - }, - }, - ], + "textDocument": { + "uri": "file:///missing-rec-3.ml", + "version": 0, }, - "isPreferred": false, - "kind": "quickfix", - "title": "Add missing \`rec\` keyword", - } - `); + }, + ], + }, + "isPreferred": false, + "kind": "quickfix", + "title": "Add missing \`rec\` keyword", +} +`); }); it("don't add rec when rec exists", async () => { - let uri = "file:///has-rec-2.ml"; + const uri = "file:///has-rec-2.ml"; openDocument( outdent` let outer = @@ -686,24 +687,24 @@ let outer = `, uri, ); - let start = Types.Position.create(2, 14); - let end = Types.Position.create(2, 15); + const start = Types.Position.create(2, 14); + const end = Types.Position.create(2, 15); - let actions = (await codeAction(uri, start, end)) ?? []; + const actions = (await codeAction(uri, start, end)) ?? []; expect(findAddRecAnnotation(actions)).toBeUndefined(); }); it("don't add rec to pattern bindings", async () => { - let uri = "file:///no-rec-1.ml"; + const uri = "file:///no-rec-1.ml"; openDocument( outdent` let (f, x) = 1 + (f x) `, uri, ); - let start = Types.Position.create(0, 18); - let end = Types.Position.create(0, 19); - let context = { + const start = Types.Position.create(0, 18); + const end = Types.Position.create(0, 19); + const context = { diagnostics: [ mkUnboundDiagnostic( Types.Position.create(0, 18), @@ -712,12 +713,12 @@ let (f, x) = 1 + (f x) ], }; - let actions = (await codeAction(uri, start, end, context)) ?? []; + const actions = (await codeAction(uri, start, end, context)) ?? []; expect(findAddRecAnnotation(actions)).toBeUndefined(); }); it("mark variable as unused", async () => { - let uri = "file:///mark-unused-variable.ml"; + const uri = "file:///mark-unused-variable.ml"; openDocument( outdent` let f x = @@ -729,9 +730,9 @@ let f x = `, uri, ); - let start = Types.Position.create(1, 6); - let end = Types.Position.create(1, 7); - let context = { + const start = Types.Position.create(1, 6); + const end = Types.Position.create(1, 7); + const context = { diagnostics: [ mkUnusedDiagnostic( Types.Position.create(1, 6), @@ -740,60 +741,60 @@ let f x = ], }; - let actions = (await codeAction(uri, start, end, context)) ?? []; + const actions = (await codeAction(uri, start, end, context)) ?? []; expect(findMarkUnused(actions)).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "message": "Error (warning 26): unused variable", - "range": Object { - "end": Object { - "character": 7, +{ + "diagnostics": [ + { + "message": "Error (warning 26): unused variable", + "range": { + "end": { + "character": 7, + "line": 1, + }, + "start": { + "character": 6, + "line": 1, + }, + }, + "severity": 2, + "source": "ocamllsp", + }, + ], + "edit": { + "documentChanges": [ + { + "edits": [ + { + "newText": "_", + "range": { + "end": { + "character": 6, "line": 1, }, - "start": Object { + "start": { "character": 6, "line": 1, }, }, - "severity": 2, - "source": "ocamllsp", }, ], - "edit": Object { - "documentChanges": Array [ - Object { - "edits": Array [ - Object { - "newText": "_", - "range": Object { - "end": Object { - "character": 6, - "line": 1, - }, - "start": Object { - "character": 6, - "line": 1, - }, - }, - }, - ], - "textDocument": Object { - "uri": "file:///mark-unused-variable.ml", - "version": 0, - }, - }, - ], + "textDocument": { + "uri": "file:///mark-unused-variable.ml", + "version": 0, }, - "isPreferred": true, - "kind": "quickfix", - "title": "Mark as unused", - } - `); + }, + ], + }, + "isPreferred": true, + "kind": "quickfix", + "title": "Mark as unused", +} +`); }); it("remove unused variable", async () => { - let uri = "file:///remove-unused-variable.ml"; + const uri = "file:///remove-unused-variable.ml"; openDocument( outdent` let f x = @@ -805,9 +806,9 @@ let f x = `, uri, ); - let start = Types.Position.create(1, 6); - let end = Types.Position.create(1, 7); - let context = { + const start = Types.Position.create(1, 6); + const end = Types.Position.create(1, 7); + const context = { diagnostics: [ mkUnusedDiagnostic( Types.Position.create(1, 6), @@ -816,60 +817,60 @@ let f x = ], }; - let actions = (await codeAction(uri, start, end, context)) ?? []; + const actions = (await codeAction(uri, start, end, context)) ?? []; expect(findRemoveUnused(actions)).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "message": "Error (warning 26): unused variable", - "range": Object { - "end": Object { - "character": 7, - "line": 1, +{ + "diagnostics": [ + { + "message": "Error (warning 26): unused variable", + "range": { + "end": { + "character": 7, + "line": 1, + }, + "start": { + "character": 6, + "line": 1, + }, + }, + "severity": 2, + "source": "ocamllsp", + }, + ], + "edit": { + "documentChanges": [ + { + "edits": [ + { + "newText": "", + "range": { + "end": { + "character": 2, + "line": 5, }, - "start": Object { - "character": 6, + "start": { + "character": 2, "line": 1, }, }, - "severity": 2, - "source": "ocamllsp", }, ], - "edit": Object { - "documentChanges": Array [ - Object { - "edits": Array [ - Object { - "newText": "", - "range": Object { - "end": Object { - "character": 2, - "line": 5, - }, - "start": Object { - "character": 2, - "line": 1, - }, - }, - }, - ], - "textDocument": Object { - "uri": "file:///remove-unused-variable.ml", - "version": 0, - }, - }, - ], + "textDocument": { + "uri": "file:///remove-unused-variable.ml", + "version": 0, }, - "isPreferred": false, - "kind": "quickfix", - "title": "Remove unused", - } - `); + }, + ], + }, + "isPreferred": false, + "kind": "quickfix", + "title": "Remove unused", +} +`); }); it("don't remove unused value in let-and binding", async () => { - let uri = "file:///remove-unused-variable-2.ml"; + const uri = "file:///remove-unused-variable-2.ml"; openDocument( outdent` let f x = @@ -878,9 +879,9 @@ let f x = `, uri, ); - let start = Types.Position.create(1, 6); - let end = Types.Position.create(1, 7); - let context = { + const start = Types.Position.create(1, 6); + const end = Types.Position.create(1, 7); + const context = { diagnostics: [ mkUnusedDiagnostic( Types.Position.create(1, 6), @@ -889,7 +890,7 @@ let f x = ], }; - let actions = (await codeAction(uri, start, end, context)) ?? []; + const actions = (await codeAction(uri, start, end, context)) ?? []; expect(findRemoveUnused(actions)).toBeUndefined(); }); }); diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-codeLens.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-codeLens.test.ts index d3ea891c9..3396e4823 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-codeLens.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-codeLens.test.ts @@ -1,7 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("textDocument/references", () => { let languageServer: LanguageServer.LanguageServer; @@ -49,53 +49,37 @@ describe("textDocument/references", () => { end `); - let result = await query(); + const result = await query(); expect(result).toMatchInlineSnapshot(` -Array [ - Object { - "command": Object { - "command": "", - "title": "int -> int -> int", - }, - "range": Object { - "end": Object { - "character": 19, - "line": 4, - }, - "start": Object { - "character": 2, - "line": 4, - }, - }, - }, - Object { - "command": Object { +[ + { + "command": { "command": "", "title": "string", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 20, "line": 1, }, - "start": Object { + "start": { "character": 0, "line": 1, }, }, }, - Object { - "command": Object { + { + "command": { "command": "", "title": "int", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 12, "line": 0, }, - "start": Object { + "start": { "character": 0, "line": 0, }, diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-declaration.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-declaration.test.ts index 60299f419..c5f6dbfbc 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-declaration.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-declaration.test.ts @@ -1,18 +1,18 @@ -import { promises as fs } from "fs"; -import * as path from "path"; -import * as child_process from "child_process"; -import * as LanguageServer from "./../src/LanguageServer"; -import * as Types from "vscode-languageserver-types"; -import { testUri } from "./../src/LanguageServer"; +import * as child_process from "node:child_process"; +import { promises as fs } from "node:fs"; +import * as path from "node:path"; import * as Protocol from "vscode-languageserver-protocol"; +import * as Types from "vscode-languageserver-types"; import { isNotNullable } from "../src/utils"; +import * as LanguageServer from "./../src/LanguageServer"; +import { testUri } from "./../src/LanguageServer"; describe("textDocument/declaration", () => { let languageServer: LanguageServer.LanguageServer; - let testWorkspacePath = path.join(__dirname, "declaration_files/"); + const testWorkspacePath = path.join(__dirname, "declaration_files/"); - let createPathForFile = (filename: string) => + const createPathForFile = (filename: string) => path.join(testWorkspacePath, filename); beforeEach(async () => { @@ -24,7 +24,7 @@ describe("textDocument/declaration", () => { }); async function openDocument(filepath: string) { - let source = await fs.readFile(filepath); + const source = await fs.readFile(filepath); languageServer.sendNotification( Protocol.DidOpenTextDocumentNotification.type, { @@ -61,20 +61,20 @@ describe("textDocument/declaration", () => { await openDocument(createPathForFile("main.ml")); - let result = await queryDeclaration( + const result = await queryDeclaration( createPathForFile("main.ml"), Types.Position.create(0, 13), ); expect(result.length).toBe(1); expect(result[0].range).toMatchInlineSnapshot(` -Object { - "end": Object { - "character": 0, +{ + "end": { + "character": 4, "line": 0, }, - "start": Object { - "character": 0, + "start": { + "character": 4, "line": 0, }, } diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-definition.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-definition.test.ts index 3d0845757..6e097da99 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-definition.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-definition.test.ts @@ -1,9 +1,9 @@ import outdent from "outdent"; -import * as LanguageServer from "./../src/LanguageServer"; -import * as Types from "vscode-languageserver-types"; -import { testUri } from "./../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; +import * as Types from "vscode-languageserver-types"; import { isNotNullable } from "../src/utils"; +import * as LanguageServer from "./../src/LanguageServer"; +import { testUri } from "./../src/LanguageServer"; describe("textDocument/definition", () => { let languageServer: LanguageServer.LanguageServer; @@ -56,7 +56,7 @@ describe("textDocument/definition", () => { print_int x `); - let result = await queryDefinition(Types.Position.create(3, 12)); + const result = await queryDefinition(Types.Position.create(3, 12)); expect(result.length).toBe(1); expect(result[0].range).toMatchObject({ diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-diagnostics.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-diagnostics.ts index e68e81bf3..248ffc898 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-diagnostics.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-diagnostics.ts @@ -1,8 +1,8 @@ import outdent from "outdent"; -import * as rpc from "vscode-jsonrpc/node"; -import * as LanguageServer from "../src/LanguageServer"; +import type * as rpc from "vscode-jsonrpc/node"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("textDocument/diagnostics", () => { let languageServer: rpc.MessageConnection; @@ -30,51 +30,51 @@ describe("textDocument/diagnostics", () => { }); it("has related diagnostics", async () => { - let receivedDiganostics = new Promise((resolve, _reject) => + const receivedDiganostics = new Promise((resolve, _reject) => languageServer.onNotification((method, params) => { expect(method).toMatchInlineSnapshot( `"textDocument/publishDiagnostics"`, ); expect(params).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "message": "This comment contains an unterminated string literal", - "range": Object { - "end": Object { - "character": 2, - "line": 0, - }, - "start": Object { - "character": 0, - "line": 0, - }, - }, - "relatedInformation": Array [ - Object { - "location": Object { - "range": Object { - "end": Object { - "character": 4, - "line": 0, - }, - "start": Object { - "character": 3, - "line": 0, - }, - }, - "uri": "file:///test.ml", - }, - "message": "String literal begins here", - }, - ], - "severity": 1, - "source": "ocamllsp", +{ + "diagnostics": [ + { + "message": "This comment contains an unterminated string literal", + "range": { + "end": { + "character": 2, + "line": 0, + }, + "start": { + "character": 0, + "line": 0, + }, + }, + "relatedInformation": [ + { + "location": { + "range": { + "end": { + "character": 4, + "line": 0, }, - ], + "start": { + "character": 3, + "line": 0, + }, + }, "uri": "file:///test.ml", - } - `); + }, + "message": "String literal begins here", + }, + ], + "severity": 1, + "source": "ocamllsp", + }, + ], + "uri": "file:///test.ml", +} +`); resolve(null); }), ); @@ -85,33 +85,33 @@ describe("textDocument/diagnostics", () => { }); it("unused values have diagnostic tags", async () => { - let receivedDiganostics = new Promise((resolve, _reject) => + const receivedDiganostics = new Promise((resolve, _reject) => languageServer.onNotification((method, params) => { expect(method).toMatchInlineSnapshot( `"textDocument/publishDiagnostics"`, ); expect(params).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "message": "Warning 26: unused variable x.", - "range": Object { - "end": Object { - "character": 7, - "line": 1, - }, - "start": Object { - "character": 6, - "line": 1, - }, - }, - "severity": 2, - "source": "ocamllsp", - }, - ], - "uri": "file:///test.ml", - } - `); +{ + "diagnostics": [ + { + "message": "Warning 26: unused variable x.", + "range": { + "end": { + "character": 7, + "line": 1, + }, + "start": { + "character": 6, + "line": 1, + }, + }, + "severity": 2, + "source": "ocamllsp", + }, + ], + "uri": "file:///test.ml", +} +`); resolve(null); }), ); @@ -124,34 +124,34 @@ describe("textDocument/diagnostics", () => { }); it("deprecated values have diganostic tags", async () => { - let receivedDiganostics = new Promise((resolve, _reject) => + const receivedDiganostics = new Promise((resolve, _reject) => languageServer.onNotification((method, params) => { expect(method).toMatchInlineSnapshot( `"textDocument/publishDiagnostics"`, ); expect(params).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "message": "Alert deprecated: X.x - do not use", - "range": Object { - "end": Object { - "character": 19, - "line": 6, - }, - "start": Object { - "character": 16, - "line": 6, - }, - }, - "severity": 2, - "source": "ocamllsp", - }, - ], - "uri": "file:///test.ml", - } - `); +{ + "diagnostics": [ + { + "message": "Alert deprecated: X.x +do not use", + "range": { + "end": { + "character": 19, + "line": 6, + }, + "start": { + "character": 16, + "line": 6, + }, + }, + "severity": 2, + "source": "ocamllsp", + }, + ], + "uri": "file:///test.ml", +} +`); resolve(null); }), ); @@ -168,73 +168,73 @@ describe("textDocument/diagnostics", () => { }); it("related diagnostics for mismatched signatures", async () => { - let receivedDiganostics = new Promise((resolve, _reject) => + const receivedDiganostics = new Promise((resolve, _reject) => languageServer.onNotification((method, params) => { expect(method).toMatchInlineSnapshot( `"textDocument/publishDiagnostics"`, ); expect(params).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "message": "Signature mismatch: - Modules do not match: - sig val x : int end - is not included in - sig val x : unit end - Values do not match: val x : int is not included in val x : unit - The type int is not compatible with the type unit", - "range": Object { - "end": Object { - "character": 3, - "line": 4, - }, - "start": Object { - "character": 6, - "line": 2, - }, - }, - "relatedInformation": Array [ - Object { - "location": Object { - "range": Object { - "end": Object { - "character": 14, - "line": 2, - }, - "start": Object { - "character": 2, - "line": 2, - }, - }, - "uri": "file:///test.ml", - }, - "message": "Expected declaration", - }, - Object { - "location": Object { - "range": Object { - "end": Object { - "character": 7, - "line": 4, - }, - "start": Object { - "character": 6, - "line": 4, - }, - }, - "uri": "file:///test.ml", - }, - "message": "Actual declaration", - }, - ], - "severity": 1, - "source": "ocamllsp", +{ + "diagnostics": [ + { + "message": "Signature mismatch: +Modules do not match: + sig val x : int end +is not included in + sig val x : unit end +Values do not match: val x : int is not included in val x : unit +The type int is not compatible with the type unit", + "range": { + "end": { + "character": 3, + "line": 4, + }, + "start": { + "character": 6, + "line": 2, + }, + }, + "relatedInformation": [ + { + "location": { + "range": { + "end": { + "character": 14, + "line": 2, + }, + "start": { + "character": 2, + "line": 2, + }, + }, + "uri": "file:///test.ml", + }, + "message": "Expected declaration", + }, + { + "location": { + "range": { + "end": { + "character": 7, + "line": 4, + }, + "start": { + "character": 6, + "line": 4, }, - ], + }, "uri": "file:///test.ml", - } - `); + }, + "message": "Actual declaration", + }, + ], + "severity": 1, + "source": "ocamllsp", + }, + ], + "uri": "file:///test.ml", +} +`); resolve(null); }), ); @@ -249,17 +249,17 @@ describe("textDocument/diagnostics", () => { }); it("no diagnostics for valid files", async () => { - let receivedDiganostics = new Promise((resolve, _reject) => + const receivedDiganostics = new Promise((resolve, _reject) => languageServer.onNotification((method, params) => { expect(method).toMatchInlineSnapshot( `"textDocument/publishDiagnostics"`, ); expect(params).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [], - "uri": "file:///test.ml", - } - `); +{ + "diagnostics": [], + "uri": "file:///test.ml", +} +`); resolve(null); }), ); @@ -272,34 +272,34 @@ describe("textDocument/diagnostics", () => { }); it("should have diagnostics for a hole only", async () => { - let receivedDiganostics = new Promise((resolve, _reject) => + const receivedDiganostics = new Promise((resolve, _reject) => languageServer.onNotification((method, params) => { expect(method).toMatchInlineSnapshot( `"textDocument/publishDiagnostics"`, ); expect(params).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "code": "hole", - "message": "This typed hole should be replaced with an expression of type int", - "range": Object { - "end": Object { - "character": 15, - "line": 0, - }, - "start": Object { - "character": 14, - "line": 0, - }, - }, - "severity": 1, - "source": "ocamllsp", - }, - ], - "uri": "file:///test.ml", - } - `); +{ + "diagnostics": [ + { + "code": "hole", + "message": "This typed hole should be replaced with an expression of type int", + "range": { + "end": { + "character": 15, + "line": 0, + }, + "start": { + "character": 14, + "line": 0, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + ], + "uri": "file:///test.ml", +} +`); resolve(null); }), ); @@ -312,81 +312,81 @@ describe("textDocument/diagnostics", () => { }); it("should have diagnostics for holes only", async () => { - let receivedDiganostics = new Promise((resolve, _reject) => + const receivedDiganostics = new Promise((resolve, _reject) => languageServer.onNotification((method, params) => { expect(method).toMatchInlineSnapshot( `"textDocument/publishDiagnostics"`, ); expect(params).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "code": "hole", - "message": "This typed hole should be replaced with an expression of type int", - "range": Object { - "end": Object { - "character": 16, - "line": 0, - }, - "start": Object { - "character": 15, - "line": 0, - }, - }, - "severity": 1, - "source": "ocamllsp", - }, - Object { - "message": "Warning 26: unused variable b.", - "range": Object { - "end": Object { - "character": 5, - "line": 1, - }, - "start": Object { - "character": 4, - "line": 1, - }, - }, - "severity": 2, - "source": "ocamllsp", - }, - Object { - "code": "hole", - "message": "This typed hole should be replaced with an expression of type string", - "range": Object { - "end": Object { - "character": 44, - "line": 1, - }, - "start": Object { - "character": 43, - "line": 1, - }, - }, - "severity": 1, - "source": "ocamllsp", - }, - Object { - "code": "hole", - "message": "This typed hole should be replaced with an expression of type string", - "range": Object { - "end": Object { - "character": 58, - "line": 1, - }, - "start": Object { - "character": 57, - "line": 1, - }, - }, - "severity": 1, - "source": "ocamllsp", - }, - ], - "uri": "file:///test.ml", - } - `); +{ + "diagnostics": [ + { + "code": "hole", + "message": "This typed hole should be replaced with an expression of type int", + "range": { + "end": { + "character": 16, + "line": 0, + }, + "start": { + "character": 15, + "line": 0, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + { + "message": "Warning 26: unused variable b.", + "range": { + "end": { + "character": 5, + "line": 1, + }, + "start": { + "character": 4, + "line": 1, + }, + }, + "severity": 2, + "source": "ocamllsp", + }, + { + "code": "hole", + "message": "This typed hole should be replaced with an expression of type string", + "range": { + "end": { + "character": 44, + "line": 1, + }, + "start": { + "character": 43, + "line": 1, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + { + "code": "hole", + "message": "This typed hole should be replaced with an expression of type string", + "range": { + "end": { + "character": 58, + "line": 1, + }, + "start": { + "character": 57, + "line": 1, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + ], + "uri": "file:///test.ml", +} +`); resolve(null); }), ); @@ -401,80 +401,80 @@ describe("textDocument/diagnostics", () => { }); it("different diagnostics, including holes, sorted by range", async () => { - let receivedDiganostics = new Promise((resolve, _reject) => + const receivedDiganostics = new Promise((resolve, _reject) => languageServer.onNotification((method, params) => { expect(method).toMatchInlineSnapshot( `"textDocument/publishDiagnostics"`, ); expect(params).toMatchInlineSnapshot(` - Object { - "diagnostics": Array [ - Object { - "message": "This expression has type unit but an expression was expected of type int", - "range": Object { - "end": Object { - "character": 42, - "line": 1, - }, - "start": Object { - "character": 40, - "line": 1, - }, - }, - "severity": 1, - "source": "ocamllsp", - }, - Object { - "code": "hole", - "message": "This typed hole should be replaced with an expression of type 'a", - "range": Object { - "end": Object { - "character": 12, - "line": 3, - }, - "start": Object { - "character": 11, - "line": 3, - }, - }, - "severity": 1, - "source": "ocamllsp", - }, - Object { - "code": "hole", - "message": "This typed hole should be replaced with an expression of type 'a", - "range": Object { - "end": Object { - "character": 12, - "line": 4, - }, - "start": Object { - "character": 11, - "line": 4, - }, - }, - "severity": 1, - "source": "ocamllsp", - }, - Object { - "message": "This expression has type string but an expression was expected of type int", - "range": Object { - "end": Object { - "character": 9, - "line": 5, - }, - "start": Object { - "character": 6, - "line": 5, - }, - }, - "severity": 1, - "source": "ocamllsp", - }, - ], - "uri": "file:///test.ml", - } - `); +{ + "diagnostics": [ + { + "message": "The constructor () has type unit but an expression was expected of type int", + "range": { + "end": { + "character": 42, + "line": 1, + }, + "start": { + "character": 40, + "line": 1, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + { + "code": "hole", + "message": "This typed hole should be replaced with an expression of type 'a", + "range": { + "end": { + "character": 12, + "line": 3, + }, + "start": { + "character": 11, + "line": 3, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + { + "code": "hole", + "message": "This typed hole should be replaced with an expression of type 'a", + "range": { + "end": { + "character": 12, + "line": 4, + }, + "start": { + "character": 11, + "line": 4, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + { + "message": "This constant has type string but an expression was expected of type int", + "range": { + "end": { + "character": 9, + "line": 5, + }, + "start": { + "character": 6, + "line": 5, + }, + }, + "severity": 1, + "source": "ocamllsp", + }, + ], + "uri": "file:///test.ml", +} +`); resolve(null); }), ); diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-documentHighlight.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-documentHighlight.test.ts index 16fca85f1..f865e1939 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-documentHighlight.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-documentHighlight.test.ts @@ -1,7 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("textDocument/references", () => { let languageServer: LanguageServer.LanguageServer; @@ -42,44 +42,44 @@ describe("textDocument/references", () => { let sum2 = sum + num `); - let result = await query(Types.Position.create(0, 4)); + const result = await query(Types.Position.create(0, 4)); expect(result).toMatchInlineSnapshot(` -Array [ - Object { +[ + { "kind": 1, - "range": Object { - "end": Object { + "range": { + "end": { "character": 7, "line": 0, }, - "start": Object { + "start": { "character": 4, "line": 0, }, }, }, - Object { + { "kind": 1, - "range": Object { - "end": Object { + "range": { + "end": { "character": 13, "line": 1, }, - "start": Object { + "start": { "character": 10, "line": 1, }, }, }, - Object { + { "kind": 1, - "range": Object { - "end": Object { + "range": { + "end": { "character": 20, "line": 2, }, - "start": Object { + "start": { "character": 17, "line": 2, }, diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-documentSymbol.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-documentSymbol.ts index 4adaa3fe4..9433090d0 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-documentSymbol.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-documentSymbol.ts @@ -1,7 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("textDocument/documentSymbol", () => { let languageServer: LanguageServer.LanguageServer; @@ -42,99 +42,99 @@ describe("textDocument/documentSymbol", () => { end `); - let result = await query(); + const result = await query(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "kind": 13, - "location": Object { - "range": Object { - "end": Object { - "character": 12, - "line": 0, - }, - "start": Object { - "character": 0, - "line": 0, - }, - }, - "uri": "file:///test.ml", - }, - "name": "num", +[ + { + "kind": 13, + "location": { + "range": { + "end": { + "character": 12, + "line": 0, }, - Object { - "kind": 13, - "location": Object { - "range": Object { - "end": Object { - "character": 20, - "line": 1, - }, - "start": Object { - "character": 0, - "line": 1, - }, - }, - "uri": "file:///test.ml", - }, - "name": "string", + "start": { + "character": 0, + "line": 0, }, - Object { - "kind": 2, - "location": Object { - "range": Object { - "end": Object { - "character": 3, - "line": 6, - }, - "start": Object { - "character": 0, - "line": 3, - }, - }, - "uri": "file:///test.ml", - }, - "name": "M", + }, + "uri": "file:///test.ml", + }, + "name": "num", + }, + { + "kind": 13, + "location": { + "range": { + "end": { + "character": 20, + "line": 1, }, - Object { - "containerName": "M", - "kind": 12, - "location": Object { - "range": Object { - "end": Object { - "character": 19, - "line": 4, - }, - "start": Object { - "character": 2, - "line": 4, - }, - }, - "uri": "file:///test.ml", - }, - "name": "m", + "start": { + "character": 0, + "line": 1, }, - Object { - "containerName": "M", - "kind": 13, - "location": Object { - "range": Object { - "end": Object { - "character": 12, - "line": 5, - }, - "start": Object { - "character": 2, - "line": 5, - }, - }, - "uri": "file:///test.ml", - }, - "name": "n", + }, + "uri": "file:///test.ml", + }, + "name": "string", + }, + { + "kind": 2, + "location": { + "range": { + "end": { + "character": 3, + "line": 6, }, - ] - `); + "start": { + "character": 0, + "line": 3, + }, + }, + "uri": "file:///test.ml", + }, + "name": "M", + }, + { + "containerName": "M", + "kind": 13, + "location": { + "range": { + "end": { + "character": 19, + "line": 4, + }, + "start": { + "character": 2, + "line": 4, + }, + }, + "uri": "file:///test.ml", + }, + "name": "m", + }, + { + "containerName": "M", + "kind": 13, + "location": { + "range": { + "end": { + "character": 12, + "line": 5, + }, + "start": { + "character": 2, + "line": 5, + }, + }, + "uri": "file:///test.ml", + }, + "name": "n", + }, +] +`); }); it("returns a hierarchy of symbols", async () => { @@ -158,137 +158,137 @@ describe("textDocument/documentSymbol", () => { end `); - let result = await query(); + const result = await query(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "children": Array [], - "kind": 13, - "name": "num", - "range": Object { - "end": Object { - "character": 12, - "line": 0, - }, - "start": Object { - "character": 0, - "line": 0, - }, +[ + { + "children": [], + "kind": 13, + "name": "num", + "range": { + "end": { + "character": 12, + "line": 0, + }, + "start": { + "character": 0, + "line": 0, + }, + }, + "selectionRange": { + "end": { + "character": 7, + "line": 0, + }, + "start": { + "character": 4, + "line": 0, + }, + }, + }, + { + "children": [], + "kind": 13, + "name": "string", + "range": { + "end": { + "character": 20, + "line": 1, + }, + "start": { + "character": 0, + "line": 1, + }, + }, + "selectionRange": { + "end": { + "character": 10, + "line": 1, + }, + "start": { + "character": 4, + "line": 1, + }, + }, + }, + { + "children": [ + { + "children": [], + "kind": 13, + "name": "m", + "range": { + "end": { + "character": 19, + "line": 4, }, - "selectionRange": Object { - "end": Object { - "character": 7, - "line": 0, - }, - "start": Object { - "character": 4, - "line": 0, - }, + "start": { + "character": 2, + "line": 4, }, }, - Object { - "children": Array [], - "kind": 13, - "name": "string", - "range": Object { - "end": Object { - "character": 20, - "line": 1, - }, - "start": Object { - "character": 0, - "line": 1, - }, + "selectionRange": { + "end": { + "character": 7, + "line": 4, }, - "selectionRange": Object { - "end": Object { - "character": 10, - "line": 1, - }, - "start": Object { - "character": 4, - "line": 1, - }, + "start": { + "character": 6, + "line": 4, }, }, - Object { - "children": Array [ - Object { - "children": Array [], - "kind": 12, - "name": "m", - "range": Object { - "end": Object { - "character": 19, - "line": 4, - }, - "start": Object { - "character": 2, - "line": 4, - }, - }, - "selectionRange": Object { - "end": Object { - "character": 7, - "line": 4, - }, - "start": Object { - "character": 6, - "line": 4, - }, - }, - }, - Object { - "children": Array [], - "kind": 13, - "name": "n", - "range": Object { - "end": Object { - "character": 12, - "line": 5, - }, - "start": Object { - "character": 2, - "line": 5, - }, - }, - "selectionRange": Object { - "end": Object { - "character": 7, - "line": 5, - }, - "start": Object { - "character": 6, - "line": 5, - }, - }, - }, - ], - "kind": 2, - "name": "M", - "range": Object { - "end": Object { - "character": 3, - "line": 6, - }, - "start": Object { - "character": 0, - "line": 3, - }, + }, + { + "children": [], + "kind": 13, + "name": "n", + "range": { + "end": { + "character": 12, + "line": 5, }, - "selectionRange": Object { - "end": Object { - "character": 8, - "line": 3, - }, - "start": Object { - "character": 7, - "line": 3, - }, + "start": { + "character": 2, + "line": 5, }, }, - ] - `); + "selectionRange": { + "end": { + "character": 7, + "line": 5, + }, + "start": { + "character": 6, + "line": 5, + }, + }, + }, + ], + "kind": 2, + "name": "M", + "range": { + "end": { + "character": 3, + "line": 6, + }, + "start": { + "character": 0, + "line": 3, + }, + }, + "selectionRange": { + "end": { + "character": 8, + "line": 3, + }, + "start": { + "character": 7, + "line": 3, + }, + }, + }, +] +`); }); }); diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-foldingRange.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-foldingRange.test.ts index 78a3eeee7..ed142f939 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-foldingRange.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-foldingRange.test.ts @@ -1,7 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("textDocument/foldingRange", () => { let languageServer: LanguageServer.LanguageServer; @@ -36,70 +36,70 @@ describe("textDocument/foldingRange", () => { it("returns folding ranges for `let`", async () => { openDocument(outdent` - let a = - let b = 1 - in - let c = - "foo" - in + let a = + let b = 1 + in + let c = + "foo" + in () `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 4, - "endLine": 6, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 9, - "endLine": 4, - "kind": "region", - "startCharacter": 2, - "startLine": 3, - }, - ] - `); +[ + { + "endCharacter": 4, + "endLine": 6, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 9, + "endLine": 4, + "kind": "region", + "startCharacter": 2, + "startLine": 3, + }, +] +`); }); it("returns folding ranges for open expressions", async () => { openDocument(outdent` - open struct - let u = + open struct + let u = () end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 3, - "endLine": 3, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 3, - "endLine": 3, - "kind": "region", - "startCharacter": 5, - "startLine": 0, - }, - Object { - "endCharacter": 6, - "endLine": 2, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - ] - `); +[ + { + "endCharacter": 3, + "endLine": 3, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 3, + "endLine": 3, + "kind": "region", + "startCharacter": 5, + "startLine": 0, + }, + { + "endCharacter": 6, + "endLine": 2, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, +] +`); }); it("returns folding ranges for Pexp_apply expressions", async () => { @@ -108,23 +108,23 @@ describe("textDocument/foldingRange", () => { two three"`); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 6, - "endLine": 2, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - ] - `); +[ + { + "endCharacter": 6, + "endLine": 2, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, +] +`); }); it("returns folding ranges for Pexp_letop", async () => { openDocument(outdent` - let () = + let () = let+ outline = Stdlib.print_endline "one"; Stdlib.print_endline "two"; @@ -133,61 +133,61 @@ describe("textDocument/foldingRange", () => { Stdlib.print_endline "one"; Stdlib.print_endline "two";`); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 29, - "endLine": 7, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 29, - "endLine": 7, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - Object { - "endCharacter": 29, - "endLine": 7, - "kind": "region", - "startCharacter": 0, - "startLine": 5, - }, - ] - `); +[ + { + "endCharacter": 29, + "endLine": 7, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 29, + "endLine": 7, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, + { + "endCharacter": 29, + "endLine": 7, + "kind": "region", + "startCharacter": 0, + "startLine": 5, + }, +] +`); }); it("returns folding ranges for Pexp_newtype", async () => { openDocument(outdent` - let magic_of_kind : type a . a ast_kind -> string = - let () = + let magic_of_kind : type a . a ast_kind -> string = + let () = Stdlib.print_endline "one"; - Stdlib.print_endline "two" + Stdlib.print_endline "two" in ()`); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 7, - "endLine": 4, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 30, - "endLine": 3, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - ] - `); +[ + { + "endCharacter": 7, + "endLine": 4, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 30, + "endLine": 3, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, +] +`); }); it("returns folding ranges for type_extension", async () => { @@ -197,135 +197,135 @@ describe("textDocument/foldingRange", () => { | B module type Type = sig - type t += - | A + type t += + | A | B end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 5, - "endLine": 2, - "kind": "region", - "startCharacter": 5, - "startLine": 0, - }, - Object { - "endCharacter": 3, - "endLine": 8, - "kind": "region", - "startCharacter": 0, - "startLine": 4, - }, - Object { - "endCharacter": 3, - "endLine": 8, - "kind": "region", - "startCharacter": 19, - "startLine": 4, - }, - Object { - "endCharacter": 7, - "endLine": 7, - "kind": "region", - "startCharacter": 7, - "startLine": 5, - }, - ] - `); +[ + { + "endCharacter": 5, + "endLine": 2, + "kind": "region", + "startCharacter": 5, + "startLine": 0, + }, + { + "endCharacter": 3, + "endLine": 8, + "kind": "region", + "startCharacter": 0, + "startLine": 4, + }, + { + "endCharacter": 3, + "endLine": 8, + "kind": "region", + "startCharacter": 19, + "startLine": 4, + }, + { + "endCharacter": 7, + "endLine": 7, + "kind": "region", + "startCharacter": 7, + "startLine": 5, + }, +] +`); }); it("returns folding ranges for match expressions", async () => { openDocument(outdent` - match - Some - "large expr" - with - | None -> - () - | Some _ -> + match + Some + "large expr" + with + | None -> + () + | Some _ -> print_endline "foo"; print_endline "bar" `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 21, - "endLine": 8, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 4, - "endLine": 5, - "kind": "region", - "startCharacter": 6, - "startLine": 4, - }, - Object { - "endCharacter": 21, - "endLine": 8, - "kind": "region", - "startCharacter": 8, - "startLine": 6, - }, - ] - `); +[ + { + "endCharacter": 21, + "endLine": 8, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 4, + "endLine": 5, + "kind": "region", + "startCharacter": 6, + "startLine": 4, + }, + { + "endCharacter": 21, + "endLine": 8, + "kind": "region", + "startCharacter": 8, + "startLine": 6, + }, +] +`); }); it("returns folding ranges for records", async () => { openDocument(outdent` - type r = { + type r = { a: string; b: int } - let f - { a; - b } = + let f + { a; + b } = { a = a; b = b + 1 } `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 1, - "endLine": 3, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 15, - "endLine": 9, - "kind": "region", - "startCharacter": 0, - "startLine": 5, - }, - Object { - "endCharacter": 11, - "endLine": 7, - "kind": "region", - "startCharacter": 6, - "startLine": 6, - }, - Object { - "endCharacter": 15, - "endLine": 9, - "kind": "region", - "startCharacter": 2, - "startLine": 8, - }, - ] - `); +[ + { + "endCharacter": 1, + "endLine": 3, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 15, + "endLine": 9, + "kind": "region", + "startCharacter": 0, + "startLine": 5, + }, + { + "endCharacter": 11, + "endLine": 7, + "kind": "region", + "startCharacter": 6, + "startLine": 6, + }, + { + "endCharacter": 15, + "endLine": 9, + "kind": "region", + "startCharacter": 2, + "startLine": 8, + }, +] +`); }); it("returns folding ranges for classes", async () => { @@ -354,60 +354,60 @@ describe("textDocument/foldingRange", () => { end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 5, - "endLine": 21, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 5, - "endLine": 21, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - Object { - "endCharacter": 6, - "endLine": 5, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - Object { - "endCharacter": 5, - "endLine": 21, - "kind": "region", - "startCharacter": 2, - "startLine": 7, - }, - Object { - "endCharacter": 15, - "endLine": 20, - "kind": "region", - "startCharacter": 4, - "startLine": 8, - }, - Object { - "endCharacter": 13, - "endLine": 18, - "kind": "region", - "startCharacter": 6, - "startLine": 9, - }, - Object { - "endCharacter": 12, - "endLine": 16, - "kind": "region", - "startCharacter": 8, - "startLine": 12, - }, - ] - `); +[ + { + "endCharacter": 5, + "endLine": 21, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 5, + "endLine": 21, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, + { + "endCharacter": 6, + "endLine": 5, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, + { + "endCharacter": 5, + "endLine": 21, + "kind": "region", + "startCharacter": 2, + "startLine": 7, + }, + { + "endCharacter": 15, + "endLine": 20, + "kind": "region", + "startCharacter": 4, + "startLine": 8, + }, + { + "endCharacter": 13, + "endLine": 18, + "kind": "region", + "startCharacter": 6, + "startLine": 9, + }, + { + "endCharacter": 12, + "endLine": 16, + "kind": "region", + "startCharacter": 8, + "startLine": 12, + }, +] +`); }); it("returns folding ranges Pexp_while", async () => { openDocument(outdent` @@ -417,18 +417,18 @@ describe("textDocument/foldingRange", () => { done `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 4, - "endLine": 3, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - ] - `); +[ + { + "endCharacter": 4, + "endLine": 3, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, +] +`); }); it("returns folding ranges Pexp_for", async () => { @@ -439,18 +439,18 @@ describe("textDocument/foldingRange", () => { done; `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 4, - "endLine": 3, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - ] - `); +[ + { + "endCharacter": 4, + "endLine": 3, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, +] +`); }); it("returns folding ranges Pexp_object", async () => { @@ -462,25 +462,25 @@ describe("textDocument/foldingRange", () => { end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 3, - "endLine": 4, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 30, - "endLine": 3, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - ] - `); +[ + { + "endCharacter": 3, + "endLine": 4, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 30, + "endLine": 3, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, +] +`); }); it("returns folding ranges Pexp_pack", async () => { @@ -494,32 +494,32 @@ describe("textDocument/foldingRange", () => { end)) `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 5, - "endLine": 6, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 3, - "endLine": 6, - "kind": "region", - "startCharacter": 18, - "startLine": 0, - }, - Object { - "endCharacter": 30, - "endLine": 5, - "kind": "region", - "startCharacter": 2, - "startLine": 3, - }, - ] - `); +[ + { + "endCharacter": 5, + "endLine": 6, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 3, + "endLine": 6, + "kind": "region", + "startCharacter": 18, + "startLine": 0, + }, + { + "endCharacter": 30, + "endLine": 5, + "kind": "region", + "startCharacter": 2, + "startLine": 3, + }, +] +`); }); it("returns folding ranges Pexp_letmodule", async () => { @@ -535,32 +535,32 @@ describe("textDocument/foldingRange", () => { end) `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 4, - "endLine": 8, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 3, - "endLine": 8, - "kind": "region", - "startCharacter": 25, - "startLine": 0, - }, - Object { - "endCharacter": 30, - "endLine": 7, - "kind": "region", - "startCharacter": 2, - "startLine": 5, - }, - ] - `); +[ + { + "endCharacter": 4, + "endLine": 8, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 3, + "endLine": 8, + "kind": "region", + "startCharacter": 25, + "startLine": 0, + }, + { + "endCharacter": 30, + "endLine": 7, + "kind": "region", + "startCharacter": 2, + "startLine": 5, + }, +] +`); }); it("returns folding ranges for value_description", async () => { @@ -574,32 +574,32 @@ describe("textDocument/foldingRange", () => { end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 3, - "endLine": 6, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 3, - "endLine": 6, - "kind": "region", - "startCharacter": 14, - "startLine": 0, - }, - Object { - "endCharacter": 20, - "endLine": 5, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - ] - `); +[ + { + "endCharacter": 3, + "endLine": 6, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 3, + "endLine": 6, + "kind": "region", + "startCharacter": 14, + "startLine": 0, + }, + { + "endCharacter": 20, + "endLine": 5, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, +] +`); }); it("returns folding ranges for Pstr_extension", async () => { @@ -613,18 +613,18 @@ describe("textDocument/foldingRange", () => { |}] `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 5, - "endLine": 6, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - ] - `); +[ + { + "endCharacter": 5, + "endLine": 6, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, +] +`); }); it("traverses Pexp_lazy nodes", async () => { @@ -639,25 +639,25 @@ describe("textDocument/foldingRange", () => { in `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 8, - "endLine": 6, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 33, - "endLine": 4, - "kind": "region", - "startCharacter": 5, - "startLine": 2, - }, - ] - `); +[ + { + "endCharacter": 8, + "endLine": 6, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 33, + "endLine": 4, + "kind": "region", + "startCharacter": 5, + "startLine": 2, + }, +] +`); }); it("traverses Pexp_letexception nodes", async () => { @@ -672,55 +672,55 @@ describe("textDocument/foldingRange", () => { in `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 4, - "endLine": 6, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 30, - "endLine": 4, - "kind": "region", - "startCharacter": 2, - "startLine": 2, - }, - ] - `); +[ + { + "endCharacter": 4, + "endLine": 6, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 30, + "endLine": 4, + "kind": "region", + "startCharacter": 2, + "startLine": 2, + }, +] +`); }); it("traverses Pexp_sequence nodes", async () => { openDocument(outdent` - let a = + let a = Stdlib.print_endline ""; - let b = + let b = 5 + 3 in b `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 3, - "endLine": 4, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 9, - "endLine": 3, - "kind": "region", - "startCharacter": 2, - "startLine": 2, - }, - ] - `); +[ + { + "endCharacter": 3, + "endLine": 4, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 9, + "endLine": 3, + "kind": "region", + "startCharacter": 2, + "startLine": 2, + }, +] +`); }); it("supports if/else", async () => { openDocument(outdent` @@ -747,84 +747,84 @@ describe("textDocument/foldingRange", () => { () `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 6, - "endLine": 20, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 6, - "endLine": 10, - "kind": "region", - "startCharacter": 5, - "startLine": 1, - }, - Object { - "endCharacter": 29, - "endLine": 4, - "kind": "region", - "startCharacter": 4, - "startLine": 2, - }, - Object { - "endCharacter": 29, - "endLine": 8, - "kind": "region", - "startCharacter": 4, - "startLine": 6, - }, - Object { - "endCharacter": 29, - "endLine": 14, - "kind": "region", - "startCharacter": 4, - "startLine": 12, - }, - Object { - "endCharacter": 29, - "endLine": 18, - "kind": "region", - "startCharacter": 4, - "startLine": 16, - }, - ] - `); +[ + { + "endCharacter": 6, + "endLine": 20, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 6, + "endLine": 10, + "kind": "region", + "startCharacter": 5, + "startLine": 1, + }, + { + "endCharacter": 29, + "endLine": 4, + "kind": "region", + "startCharacter": 4, + "startLine": 2, + }, + { + "endCharacter": 29, + "endLine": 8, + "kind": "region", + "startCharacter": 4, + "startLine": 6, + }, + { + "endCharacter": 29, + "endLine": 14, + "kind": "region", + "startCharacter": 4, + "startLine": 12, + }, + { + "endCharacter": 29, + "endLine": 18, + "kind": "region", + "startCharacter": 4, + "startLine": 16, + }, +] +`); }); it("supports return type annotation", async () => { openDocument(outdent` - let fn a b : int = - let result = + let fn a b : int = + let result = Stdlib.print_endline ""; - a + b + a + b in result `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 8, - "endLine": 5, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 9, - "endLine": 3, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - ] - `); +[ + { + "endCharacter": 8, + "endLine": 5, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 9, + "endLine": 3, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, +] +`); }); it("returns folding ranges for try/with", async () => { @@ -845,46 +845,46 @@ describe("textDocument/foldingRange", () => { None `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 8, - "endLine": 13, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 8, - "endLine": 13, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - Object { - "endCharacter": 29, - "endLine": 4, - "kind": "region", - "startCharacter": 4, - "startLine": 2, - }, - Object { - "endCharacter": 8, - "endLine": 13, - "kind": "region", - "startCharacter": 13, - "startLine": 8, - }, - Object { - "endCharacter": 29, - "endLine": 11, - "kind": "region", - "startCharacter": 4, - "startLine": 9, - }, - ] - `); +[ + { + "endCharacter": 8, + "endLine": 13, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 8, + "endLine": 13, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, + { + "endCharacter": 29, + "endLine": 4, + "kind": "region", + "startCharacter": 4, + "startLine": 2, + }, + { + "endCharacter": 8, + "endLine": 13, + "kind": "region", + "startCharacter": 13, + "startLine": 8, + }, + { + "endCharacter": 29, + "endLine": 11, + "kind": "region", + "startCharacter": 4, + "startLine": 9, + }, +] +`); }); it("traverses Pexp_construct", async () => { @@ -899,25 +899,25 @@ describe("textDocument/foldingRange", () => { 5) `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 7, - "endLine": 7, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 30, - "endLine": 5, - "kind": "region", - "startCharacter": 5, - "startLine": 2, - }, - ] - `); +[ + { + "endCharacter": 7, + "endLine": 7, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 30, + "endLine": 5, + "kind": "region", + "startCharacter": 5, + "startLine": 2, + }, +] +`); }); it("returns folding ranges for modules", async () => { @@ -981,158 +981,158 @@ describe("textDocument/foldingRange", () => { end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 3, - "endLine": 5, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 3, - "endLine": 5, - "kind": "region", - "startCharacter": 16, - "startLine": 0, - }, - Object { - "endCharacter": 7, - "endLine": 4, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - Object { - "endCharacter": 3, - "endLine": 56, - "kind": "region", - "startCharacter": 0, - "startLine": 7, - }, - Object { - "endCharacter": 3, - "endLine": 56, - "kind": "region", - "startCharacter": 11, - "startLine": 7, - }, - Object { - "endCharacter": 5, - "endLine": 18, - "kind": "region", - "startCharacter": 2, - "startLine": 8, - }, - Object { - "endCharacter": 5, - "endLine": 18, - "kind": "region", - "startCharacter": 18, - "startLine": 8, - }, - Object { - "endCharacter": 7, - "endLine": 14, - "kind": "region", - "startCharacter": 4, - "startLine": 9, - }, - Object { - "endCharacter": 7, - "endLine": 14, - "kind": "region", - "startCharacter": 16, - "startLine": 9, - }, - Object { - "endCharacter": 11, - "endLine": 13, - "kind": "region", - "startCharacter": 6, - "startLine": 10, - }, - Object { - "endCharacter": 5, - "endLine": 31, - "kind": "region", - "startCharacter": 2, - "startLine": 20, - }, - Object { - "endCharacter": 5, - "endLine": 31, - "kind": "region", - "startCharacter": 13, - "startLine": 20, - }, - Object { - "endCharacter": 30, - "endLine": 30, - "kind": "region", - "startCharacter": 4, - "startLine": 21, - }, - Object { - "endCharacter": 30, - "endLine": 30, - "kind": "region", - "startCharacter": 6, - "startLine": 22, - }, - Object { - "endCharacter": 31, - "endLine": 26, - "kind": "region", - "startCharacter": 12, - "startLine": 23, - }, - Object { - "endCharacter": 30, - "endLine": 30, - "kind": "region", - "startCharacter": 14, - "startLine": 27, - }, - Object { - "endCharacter": 9, - "endLine": 55, - "kind": "region", - "startCharacter": 2, - "startLine": 33, - }, - Object { - "endCharacter": 11, - "endLine": 53, - "kind": "region", - "startCharacter": 4, - "startLine": 34, - }, - Object { - "endCharacter": 10, - "endLine": 42, - "kind": "region", - "startCharacter": 6, - "startLine": 38, - }, - Object { - "endCharacter": 25, - "endLine": 47, - "kind": "region", - "startCharacter": 6, - "startLine": 45, - }, - Object { - "endCharacter": 11, - "endLine": 53, - "kind": "region", - "startCharacter": 6, - "startLine": 49, - }, - ] - `); +[ + { + "endCharacter": 3, + "endLine": 5, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 3, + "endLine": 5, + "kind": "region", + "startCharacter": 16, + "startLine": 0, + }, + { + "endCharacter": 7, + "endLine": 4, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, + { + "endCharacter": 3, + "endLine": 56, + "kind": "region", + "startCharacter": 0, + "startLine": 7, + }, + { + "endCharacter": 3, + "endLine": 56, + "kind": "region", + "startCharacter": 11, + "startLine": 7, + }, + { + "endCharacter": 5, + "endLine": 18, + "kind": "region", + "startCharacter": 2, + "startLine": 8, + }, + { + "endCharacter": 5, + "endLine": 18, + "kind": "region", + "startCharacter": 18, + "startLine": 8, + }, + { + "endCharacter": 7, + "endLine": 14, + "kind": "region", + "startCharacter": 4, + "startLine": 9, + }, + { + "endCharacter": 7, + "endLine": 14, + "kind": "region", + "startCharacter": 16, + "startLine": 9, + }, + { + "endCharacter": 11, + "endLine": 13, + "kind": "region", + "startCharacter": 6, + "startLine": 10, + }, + { + "endCharacter": 5, + "endLine": 31, + "kind": "region", + "startCharacter": 2, + "startLine": 20, + }, + { + "endCharacter": 5, + "endLine": 31, + "kind": "region", + "startCharacter": 13, + "startLine": 20, + }, + { + "endCharacter": 30, + "endLine": 30, + "kind": "region", + "startCharacter": 4, + "startLine": 21, + }, + { + "endCharacter": 30, + "endLine": 30, + "kind": "region", + "startCharacter": 6, + "startLine": 22, + }, + { + "endCharacter": 31, + "endLine": 26, + "kind": "region", + "startCharacter": 12, + "startLine": 23, + }, + { + "endCharacter": 30, + "endLine": 30, + "kind": "region", + "startCharacter": 14, + "startLine": 27, + }, + { + "endCharacter": 9, + "endLine": 55, + "kind": "region", + "startCharacter": 2, + "startLine": 33, + }, + { + "endCharacter": 11, + "endLine": 53, + "kind": "region", + "startCharacter": 4, + "startLine": 34, + }, + { + "endCharacter": 10, + "endLine": 42, + "kind": "region", + "startCharacter": 6, + "startLine": 38, + }, + { + "endCharacter": 25, + "endLine": 47, + "kind": "region", + "startCharacter": 6, + "startLine": 45, + }, + { + "endCharacter": 11, + "endLine": 53, + "kind": "region", + "startCharacter": 6, + "startLine": 49, + }, +] +`); }); it("traverses Pstr_extension structure item", async () => { @@ -1145,32 +1145,32 @@ describe("textDocument/foldingRange", () => { Stdlib.print_endline (string_of_int 5) `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 40, - "endLine": 5, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 40, - "endLine": 5, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 9, - "endLine": 3, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - ] - `); +[ + { + "endCharacter": 40, + "endLine": 5, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 40, + "endLine": 5, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 9, + "endLine": 3, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, +] +`); }); it("returns folding ranges for class_type", async () => { @@ -1182,25 +1182,25 @@ describe("textDocument/foldingRange", () => { end;; `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 3, - "endLine": 4, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 3, - "endLine": 4, - "kind": "region", - "startCharacter": 0, - "startLine": 1, - }, - ] - `); +[ + { + "endCharacter": 3, + "endLine": 4, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 3, + "endLine": 4, + "kind": "region", + "startCharacter": 0, + "startLine": 1, + }, +] +`); }); it("returns folding ranges for class_type_field", async () => { @@ -1217,90 +1217,90 @@ describe("textDocument/foldingRange", () => { end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 3, - "endLine": 9, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 3, - "endLine": 9, - "kind": "region", - "startCharacter": 19, - "startLine": 0, - }, - Object { - "endCharacter": 7, - "endLine": 8, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - Object { - "endCharacter": 7, - "endLine": 8, - "kind": "region", - "startCharacter": 4, - "startLine": 2, - }, - Object { - "endCharacter": 47, - "endLine": 7, - "kind": "region", - "startCharacter": 6, - "startLine": 3, - }, - ] - `); +[ + { + "endCharacter": 3, + "endLine": 9, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 3, + "endLine": 9, + "kind": "region", + "startCharacter": 19, + "startLine": 0, + }, + { + "endCharacter": 7, + "endLine": 8, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, + { + "endCharacter": 7, + "endLine": 8, + "kind": "region", + "startCharacter": 4, + "startLine": 2, + }, + { + "endCharacter": 47, + "endLine": 7, + "kind": "region", + "startCharacter": 6, + "startLine": 3, + }, +] +`); }); it("returns folding ranges for class_description", async () => { openDocument(outdent` module type T = sig - class cse_generic : - object + class cse_generic : + object end end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 3, - "endLine": 4, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 3, - "endLine": 4, - "kind": "region", - "startCharacter": 16, - "startLine": 0, - }, - Object { - "endCharacter": 7, - "endLine": 3, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - Object { - "endCharacter": 7, - "endLine": 3, - "kind": "region", - "startCharacter": 4, - "startLine": 2, - }, - ] - `); +[ + { + "endCharacter": 3, + "endLine": 4, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 3, + "endLine": 4, + "kind": "region", + "startCharacter": 16, + "startLine": 0, + }, + { + "endCharacter": 7, + "endLine": 3, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, + { + "endCharacter": 7, + "endLine": 3, + "kind": "region", + "startCharacter": 4, + "startLine": 2, + }, +] +`); }); it("returns folding ranges for class_expr", async () => { @@ -1313,25 +1313,25 @@ describe("textDocument/foldingRange", () => { end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 5, - "endLine": 5, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 5, - "endLine": 5, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - ] - `); +[ + { + "endCharacter": 5, + "endLine": 5, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 5, + "endLine": 5, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, +] +`); }); it("returns folding ranges for class_type", async () => { @@ -1343,25 +1343,25 @@ describe("textDocument/foldingRange", () => { end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 5, - "endLine": 4, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 5, - "endLine": 4, - "kind": "region", - "startCharacter": 2, - "startLine": 1, - }, - ] - `); +[ + { + "endCharacter": 5, + "endLine": 4, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 5, + "endLine": 4, + "kind": "region", + "startCharacter": 2, + "startLine": 1, + }, +] +`); }); it("returns folding ranges for Pmod_functor and Pmod_structure", async () => { @@ -1369,53 +1369,53 @@ describe("textDocument/foldingRange", () => { module M = functor (M : S) -> (val x) - (struct + (struct type t = int - let x = + let x = Stdlib.print_endline "one"; Stdlib.print_endline "two"; end) `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 8, - "endLine": 8, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 8, - "endLine": 8, - "kind": "region", - "startCharacter": 10, - "startLine": 1, - }, - Object { - "endCharacter": 7, - "endLine": 8, - "kind": "region", - "startCharacter": 5, - "startLine": 3, - }, - Object { - "endCharacter": 35, - "endLine": 7, - "kind": "region", - "startCharacter": 6, - "startLine": 5, - }, - ] - `); +[ + { + "endCharacter": 8, + "endLine": 8, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 8, + "endLine": 8, + "kind": "region", + "startCharacter": 10, + "startLine": 1, + }, + { + "endCharacter": 7, + "endLine": 8, + "kind": "region", + "startCharacter": 5, + "startLine": 3, + }, + { + "endCharacter": 35, + "endLine": 7, + "kind": "region", + "startCharacter": 6, + "startLine": 5, + }, +] +`); }); it("returns folding ranges for Pmty_functor and Pmty_signature", async () => { openDocument(outdent` - module type S = - functor (M : S) (_ : module type of M) -> + module type S = + functor (M : S) (_ : module type of M) -> sig type t = | A @@ -1423,46 +1423,46 @@ describe("textDocument/foldingRange", () => { end `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 7, - "endLine": 6, - "kind": "region", - "startCharacter": 0, - "startLine": 0, - }, - Object { - "endCharacter": 7, - "endLine": 6, - "kind": "region", - "startCharacter": 10, - "startLine": 1, - }, - Object { - "endCharacter": 7, - "endLine": 6, - "kind": "region", - "startCharacter": 18, - "startLine": 1, - }, - Object { - "endCharacter": 7, - "endLine": 6, - "kind": "region", - "startCharacter": 4, - "startLine": 2, - }, - Object { - "endCharacter": 11, - "endLine": 5, - "kind": "region", - "startCharacter": 6, - "startLine": 3, - }, - ] - `); +[ + { + "endCharacter": 7, + "endLine": 6, + "kind": "region", + "startCharacter": 0, + "startLine": 0, + }, + { + "endCharacter": 7, + "endLine": 6, + "kind": "region", + "startCharacter": 10, + "startLine": 1, + }, + { + "endCharacter": 7, + "endLine": 6, + "kind": "region", + "startCharacter": 18, + "startLine": 1, + }, + { + "endCharacter": 7, + "endLine": 6, + "kind": "region", + "startCharacter": 4, + "startLine": 2, + }, + { + "endCharacter": 11, + "endLine": 5, + "kind": "region", + "startCharacter": 6, + "startLine": 3, + }, +] +`); }); it("returns folding ranges for Pexp_ifthenelse", async () => { @@ -1485,38 +1485,38 @@ describe("textDocument/foldingRange", () => { () `); - let result = await foldingRange(); + const result = await foldingRange(); expect(result).toMatchInlineSnapshot(` - Array [ - Object { - "endCharacter": 54, - "endLine": 3, - "kind": "region", - "startCharacter": 3, - "startLine": 0, - }, - Object { - "endCharacter": 42, - "endLine": 2, - "kind": "region", - "startCharacter": 5, - "startLine": 1, - }, - Object { - "endCharacter": 6, - "endLine": 8, - "kind": "region", - "startCharacter": 2, - "startLine": 5, - }, - Object { - "endCharacter": 6, - "endLine": 13, - "kind": "region", - "startCharacter": 2, - "startLine": 10, - }, - ] - `); +[ + { + "endCharacter": 54, + "endLine": 3, + "kind": "region", + "startCharacter": 3, + "startLine": 0, + }, + { + "endCharacter": 42, + "endLine": 2, + "kind": "region", + "startCharacter": 5, + "startLine": 1, + }, + { + "endCharacter": 6, + "endLine": 8, + "kind": "region", + "startCharacter": 2, + "startLine": 5, + }, + { + "endCharacter": 6, + "endLine": 13, + "kind": "region", + "startCharacter": 2, + "startLine": 10, + }, +] +`); }); }); diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-formatting.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-formatting.test.ts index dca1566ac..5a11ccd98 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-formatting.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-formatting.test.ts @@ -1,9 +1,9 @@ -import * as LanguageServer from "../src/LanguageServer"; +import * as fs from "node:fs"; +import * as os from "node:os"; +import * as path from "node:path"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; -import * as fs from "fs"; -import * as path from "path"; -import * as os from "os"; +import * as LanguageServer from "../src/LanguageServer"; const ocamlFormat = ` break-cases=all @@ -25,7 +25,7 @@ wrap-comments=true `; function setupOcamlFormat(ocamlFormat: string) { - let tmpdir = fs.mkdtempSync(path.join(os.tmpdir(), "ocamllsp-test-")); + const tmpdir = fs.mkdtempSync(path.join(os.tmpdir(), "ocamllsp-test-")); fs.writeFileSync(path.join(tmpdir, ".ocamlformat"), ocamlFormat); return tmpdir; } @@ -69,7 +69,7 @@ maybeDescribe("textDocument/formatting", () => { it("can format an ocaml impl file", async () => { languageServer = await LanguageServer.startAndInitialize(); - let name = path.join(setupOcamlFormat(ocamlFormat), "test.ml"); + const name = path.join(setupOcamlFormat(ocamlFormat), "test.ml"); openDocument( languageServer, @@ -82,18 +82,18 @@ maybeDescribe("textDocument/formatting", () => { name, ); - let result = await query(languageServer, name); + const result = await query(languageServer, name); expect(result).toMatchInlineSnapshot(` -Array [ - Object { +[ + { "newText": " | 0, n ", - "range": Object { - "end": Object { + "range": { + "end": { "character": 0, "line": 3, }, - "start": Object { + "start": { "character": 0, "line": 2, }, @@ -106,7 +106,7 @@ Array [ it("leaves unchanged files alone", async () => { languageServer = await LanguageServer.startAndInitialize(); - let name = path.join(setupOcamlFormat(ocamlFormat), "test.ml"); + const name = path.join(setupOcamlFormat(ocamlFormat), "test.ml"); openDocument( languageServer, @@ -119,14 +119,14 @@ Array [ name, ); - let result = await query(languageServer, name); + const result = await query(languageServer, name); expect(result).toMatchObject([]); }); it("can format an ocaml intf file", async () => { languageServer = await LanguageServer.startAndInitialize(); - let name = path.join(setupOcamlFormat(ocamlFormat), "test.mli"); + const name = path.join(setupOcamlFormat(ocamlFormat), "test.mli"); openDocument( languageServer, @@ -134,19 +134,19 @@ Array [ name, ); - let result = await query(languageServer, name); + const result = await query(languageServer, name); expect(result).toMatchInlineSnapshot(` -Array [ - Object { +[ + { "newText": "module Test : sig ", - "range": Object { - "end": Object { + "range": { + "end": { "character": 0, "line": 1, }, - "start": Object { + "start": { "character": 0, "line": 0, }, @@ -159,12 +159,12 @@ Array [ it("does not format ignored files", async () => { languageServer = await LanguageServer.startAndInitialize(); - let tmpdir = setupOcamlFormat(ocamlFormat); + const tmpdir = setupOcamlFormat(ocamlFormat); - let ocamlFormatIgnore = path.join(tmpdir, ".ocamlformat-ignore"); + const ocamlFormatIgnore = path.join(tmpdir, ".ocamlformat-ignore"); fs.writeFileSync(ocamlFormatIgnore, "test.ml\n"); - let name = path.join(tmpdir, "test.ml"); + const name = path.join(tmpdir, "test.ml"); openDocument( languageServer, @@ -176,7 +176,7 @@ Array [ name, ); - let result = await query(languageServer, name); + const result = await query(languageServer, name); expect(result).toMatchObject([]); }); }); diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-hover.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-hover.test.ts index f341b04de..39eeb0f56 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-hover.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-hover.test.ts @@ -1,7 +1,6 @@ import outdent from "outdent"; -import * as LanguageServer from "./../src/LanguageServer"; - import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "./../src/LanguageServer"; describe("textDocument/hover", () => { let languageServer: LanguageServer.LanguageServer; @@ -21,23 +20,23 @@ describe("textDocument/hover", () => { ), }); - let result = await languageServer.sendRequest("textDocument/hover", { + const result = await languageServer.sendRequest("textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(0, 4), }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "plaintext", "value": "int", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 5, "line": 0, }, - "start": Object { + "start": { "character": 4, "line": 0, }, @@ -67,25 +66,25 @@ Object { ), }); - let result = await languageServer.sendRequest("textDocument/hover", { + const result = await languageServer.sendRequest("textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(0, 4), }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml int \`\`\`", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 5, "line": 0, }, - "start": Object { + "start": { "character": 4, "line": 0, }, @@ -121,14 +120,14 @@ int ), }); - let result = await languageServer.sendRequest("textDocument/hover", { + const result = await languageServer.sendRequest("textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(1, 4), }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml 'a -> 'a @@ -136,12 +135,12 @@ Object { *** This function has a nice documentation", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 6, "line": 1, }, - "start": Object { + "start": { "character": 4, "line": 1, }, @@ -176,14 +175,14 @@ This function has a nice documentation", ), }); - let result = await languageServer.sendRequest("textDocument/hover", { + const result = await languageServer.sendRequest("textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(3, 9), }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml 'a -> 'a @@ -191,12 +190,12 @@ Object { *** This function has a nice documentation", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 11, "line": 3, }, - "start": Object { + "start": { "character": 9, "line": 3, }, @@ -251,14 +250,14 @@ This function has a nice documentation", ), }); - let result = await languageServer.sendRequest("textDocument/hover", { + const result = await languageServer.sendRequest("textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(23, 9), }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml int -> int -> int @@ -279,7 +278,7 @@ dividend ***@raise*** \`Division_by_zero\` raised when divided by zero -***@see*** [link](https://en.wikipedia.org/wiki/Arithmetic#Division_\\\\(%C3%B7,_or_/\\\\)) +***@see*** [link](https://en.wikipedia.org/wiki/Arithmetic#Division_\\(%C3%B7,_or_/\\)) article ***@see*** \`arithmetic.ml\` @@ -296,12 +295,12 @@ use \`(/)\` ***@author*** John Doe", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 11, "line": 23, }, - "start": Object { + "start": { "character": 8, "line": 23, }, @@ -336,25 +335,25 @@ use \`(/)\` ), }); - let result = await languageServer.sendRequest("textDocument/hover", { + const result = await languageServer.sendRequest("textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(3, 13), }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml int \`\`\`", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 13, "line": 3, }, - "start": Object { + "start": { "character": 12, "line": 3, }, @@ -388,25 +387,25 @@ int ), }); - let hover1 = await languageServer.sendRequest("textDocument/hover", { + const hover1 = await languageServer.sendRequest("textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(1, 4), }); expect(hover1).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml type s = t \`\`\`", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 14, "line": 1, }, - "start": Object { + "start": { "character": 0, "line": 1, }, @@ -414,25 +413,25 @@ type s = t } `); - let hover2 = await languageServer.sendRequest("textDocument/hover", { + const hover2 = await languageServer.sendRequest("textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(2, 9), }); expect(hover2).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml type 'a fib = ('a -> unit) -> unit \`\`\`", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 34, "line": 2, }, - "start": Object { + "start": { "character": 0, "line": 2, }, @@ -456,23 +455,23 @@ let x : foo = 1 ), }); - let result = await languageServer.sendRequest("textDocument/hover", { + const result = await languageServer.sendRequest("textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(2, 4), }); expect(result).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "plaintext", "value": "foo", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 5, "line": 2, }, - "start": Object { + "start": { "character": 4, "line": 2, }, @@ -532,25 +531,25 @@ Object { }); // here we see that all is ok - let hoverOverK = await languageServer.sendRequest("textDocument/hover", { + const hoverOverK = await languageServer.sendRequest("textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position: Types.Position.create(24, 4), }); expect(hoverOverK).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml unit \`\`\`", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 5, "line": 24, }, - "start": Object { + "start": { "character": 4, "line": 24, }, @@ -559,7 +558,7 @@ unit `); // we trigger the bug - let autocompleteForListm = await languageServer.sendRequest( + const autocompleteForListm = await languageServer.sendRequest( "textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), @@ -567,7 +566,7 @@ unit }, ); - let buggedHoverOverK = await languageServer.sendRequest( + const buggedHoverOverK = await languageServer.sendRequest( "textDocument/hover", { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), @@ -577,19 +576,19 @@ unit // now the same hover as before comes with unrelated documentation expect(buggedHoverOverK).toMatchInlineSnapshot(` -Object { - "contents": Object { +{ + "contents": { "kind": "markdown", "value": "\`\`\`ocaml unit \`\`\`", }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 5, "line": 24, }, - "start": Object { + "start": { "character": 4, "line": 24, }, diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-references.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-references.test.ts index 3386cecde..3a9dba1f2 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-references.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-references.test.ts @@ -1,7 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("textDocument/references", () => { let languageServer: LanguageServer.LanguageServer; @@ -43,43 +43,43 @@ describe("textDocument/references", () => { let sum2 = sum + num `); - let result = await query(Types.Position.create(0, 4)); + const result = await query(Types.Position.create(0, 4)); expect(result).toMatchInlineSnapshot(` -Array [ - Object { - "range": Object { - "end": Object { +[ + { + "range": { + "end": { "character": 7, "line": 0, }, - "start": Object { + "start": { "character": 4, "line": 0, }, }, "uri": "file:///test.ml", }, - Object { - "range": Object { - "end": Object { + { + "range": { + "end": { "character": 13, "line": 1, }, - "start": Object { + "start": { "character": 10, "line": 1, }, }, "uri": "file:///test.ml", }, - Object { - "range": Object { - "end": Object { + { + "range": { + "end": { "character": 20, "line": 2, }, - "start": Object { + "start": { "character": 17, "line": 2, }, diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-rename.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-rename.test.ts index 87dd2ba49..5f718ae6a 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-rename.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-rename.test.ts @@ -1,7 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("textDocument/rename", () => { let languageServer: LanguageServer.LanguageServer; @@ -21,7 +21,7 @@ describe("textDocument/rename", () => { } async function query(position: Types.Position, newNameOpt?: string) { - let newName = newNameOpt ? newNameOpt : "new_num"; + const newName = newNameOpt ? newNameOpt : "new_num"; return await languageServer.sendRequest(Protocol.RenameRequest.type, { textDocument: Types.TextDocumentIdentifier.create("file:///test.ml"), position, @@ -56,7 +56,7 @@ describe("textDocument/rename", () => { let num2 = num `); - let result = await query_prepare(Types.Position.create(0, 1)); + const result = await query_prepare(Types.Position.create(0, 1)); expect(result).toBeNull(); }); @@ -73,14 +73,14 @@ describe("textDocument/rename", () => { let num2 = num `); - let result = await query_prepare(Types.Position.create(0, 4)); + const result = await query_prepare(Types.Position.create(0, 4)); expect(result).toMatchInlineSnapshot(` -Object { - "end": Object { +{ + "end": { "character": 7, "line": 0, }, - "start": Object { + "start": { "character": 4, "line": 0, }, @@ -101,35 +101,35 @@ Object { let num2 = num `); - let result = await query(Types.Position.create(0, 4)); + const result = await query(Types.Position.create(0, 4)); expect(result).toMatchInlineSnapshot(` -Object { - "changes": Object { - "file:///test.ml": Array [ - Object { +{ + "changes": { + "file:///test.ml": [ + { "newText": "new_num", - "range": Object { - "end": Object { - "character": 7, - "line": 0, + "range": { + "end": { + "character": 13, + "line": 1, }, - "start": Object { - "character": 4, - "line": 0, + "start": { + "character": 10, + "line": 1, }, }, }, - Object { + { "newText": "new_num", - "range": Object { - "end": Object { - "character": 13, - "line": 1, + "range": { + "end": { + "character": 7, + "line": 0, }, - "start": Object { - "character": 10, - "line": 1, + "start": { + "character": 4, + "line": 0, }, }, }, @@ -152,41 +152,41 @@ Object { let num2 = num `); - let result = await query(Types.Position.create(0, 4)); + const result = await query(Types.Position.create(0, 4)); expect(result).toMatchInlineSnapshot(` -Object { - "documentChanges": Array [ - Object { - "edits": Array [ - Object { +{ + "documentChanges": [ + { + "edits": [ + { "newText": "new_num", - "range": Object { - "end": Object { - "character": 7, - "line": 0, + "range": { + "end": { + "character": 13, + "line": 1, }, - "start": Object { - "character": 4, - "line": 0, + "start": { + "character": 10, + "line": 1, }, }, }, - Object { + { "newText": "new_num", - "range": Object { - "end": Object { - "character": 13, - "line": 1, + "range": { + "end": { + "character": 7, + "line": 0, }, - "start": Object { - "character": 10, - "line": 1, + "start": { + "character": 4, + "line": 0, }, }, }, ], - "textDocument": Object { + "textDocument": { "uri": "file:///test.ml", "version": 0, }, @@ -211,42 +211,42 @@ let bar ~foo = foo () let () = bar ~foo `); - let result = await query(Types.Position.create(0, 4), "ident"); + const result = await query(Types.Position.create(0, 4), "ident"); expect(result).toMatchInlineSnapshot(` - Object { - "changes": Object { - "file:///test.ml": Array [ - Object { - "newText": "ident", - "range": Object { - "end": Object { - "character": 7, - "line": 0, - }, - "start": Object { - "character": 4, - "line": 0, - }, - }, - }, - Object { - "newText": ":ident", - "range": Object { - "end": Object { - "character": 17, - "line": 4, - }, - "start": Object { - "character": 17, - "line": 4, - }, - }, - }, - ], +{ + "changes": { + "file:///test.ml": [ + { + "newText": ":ident", + "range": { + "end": { + "character": 17, + "line": 4, + }, + "start": { + "character": 17, + "line": 4, + }, }, - } - `); + }, + { + "newText": "ident", + "range": { + "end": { + "character": 7, + "line": 0, + }, + "start": { + "character": 4, + "line": 0, + }, + }, + }, + ], + }, +} +`); }); it("rename a var used as a named argument", async () => { @@ -265,41 +265,41 @@ let bar ?foo () = foo ignore (bar ?foo ()) `); - let result = await query(Types.Position.create(0, 4), "sunit"); + const result = await query(Types.Position.create(0, 4), "sunit"); expect(result).toMatchInlineSnapshot(` - Object { - "changes": Object { - "file:///test.ml": Array [ - Object { - "newText": "sunit", - "range": Object { - "end": Object { - "character": 7, - "line": 0, - }, - "start": Object { - "character": 4, - "line": 0, - }, - }, - }, - Object { - "newText": ":sunit", - "range": Object { - "end": Object { - "character": 16, - "line": 5, - }, - "start": Object { - "character": 16, - "line": 5, - }, - }, - }, - ], +{ + "changes": { + "file:///test.ml": [ + { + "newText": ":sunit", + "range": { + "end": { + "character": 16, + "line": 5, + }, + "start": { + "character": 16, + "line": 5, + }, }, - } - `); + }, + { + "newText": "sunit", + "range": { + "end": { + "character": 7, + "line": 0, + }, + "start": { + "character": 4, + "line": 0, + }, + }, + }, + ], + }, +} +`); }); }); diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-selectionRange.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-selectionRange.test.ts index f0a606932..bb6a1ef7a 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-selectionRange.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-selectionRange.test.ts @@ -1,7 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "../src/LanguageServer"; describe("textDocument/selectionRange", () => { let languageServer: LanguageServer.LanguageServer; @@ -46,88 +46,76 @@ describe("textDocument/selectionRange", () => { min_ab * max_ab `); - let result = await selectionRange([Types.Position.create(1, 17)]); + const result = await selectionRange([Types.Position.create(1, 17)]); expect(result).toMatchInlineSnapshot(` -Array [ - Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "range": Object { - "end": Object { - "character": 17, - "line": 3, - }, - "start": Object { - "character": 0, - "line": 0, - }, - }, - }, - "range": Object { - "end": Object { +[ + { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "range": { + "end": { "character": 17, "line": 3, }, - "start": Object { - "character": 8, + "start": { + "character": 0, "line": 0, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 17, "line": 3, }, - "start": Object { - "character": 10, + "start": { + "character": 8, "line": 0, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 17, "line": 3, }, - "start": Object { + "start": { "character": 2, "line": 1, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 22, "line": 1, }, - "start": Object { + "start": { "character": 2, "line": 1, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 22, "line": 1, }, - "start": Object { + "start": { "character": 15, "line": 1, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 18, "line": 1, }, - "start": Object { + "start": { "character": 15, "line": 1, }, @@ -148,107 +136,96 @@ Array [ end `); - let result = await selectionRange([Types.Position.create(5, 23)]); + const result = await selectionRange([Types.Position.create(5, 23)]); expect(result).toMatchInlineSnapshot(` -Array [ - Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "range": Object { - "end": Object { - "character": 3, - "line": 6, - }, - "start": Object { - "character": 0, - "line": 0, - }, - }, - }, - "range": Object { - "end": Object { +[ + { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "range": { + "end": { "character": 3, "line": 6, }, - "start": Object { + "start": { "character": 0, "line": 3, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 3, "line": 6, }, - "start": Object { - "character": 11, + "start": { + "character": 0, "line": 3, }, }, }, - "range": Object { - "end": Object { - "character": 24, - "line": 5, + "range": { + "end": { + "character": 3, + "line": 6, }, - "start": Object { - "character": 2, - "line": 4, + "start": { + "character": 11, + "line": 3, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 24, "line": 5, }, - "start": Object { + "start": { "character": 2, "line": 5, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 24, "line": 5, }, - "start": Object { - "character": 8, + "start": { + "character": 2, "line": 5, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 24, "line": 5, }, - "start": Object { - "character": 9, + "start": { + "character": 8, "line": 5, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 24, "line": 5, }, - "start": Object { + "start": { "character": 22, "line": 5, }, }, }, ] -`)}); +`); + }); it("returns a selection range for functors", async () => { openDocument(outdent` @@ -257,297 +234,288 @@ module M = Map.Make (struct let compare a b = a.o#rank - b.o#rank end)`); - let result = await selectionRange([Types.Position.create(2, 26)]); - expect(result).toMatchInlineSnapshot(` -Array [ - Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "range": Object { - "end": Object { - "character": 4, - "line": 3, - }, - "start": Object { - "character": 0, - "line": 0, - }, - }, - }, - "range": Object { - "end": Object { + const result = await selectionRange([Types.Position.create(2, 26)]); + expect(result).toMatchInlineSnapshot(` +[ + { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "range": { + "end": { "character": 4, "line": 3, }, - "start": Object { - "character": 11, + "start": { + "character": 0, "line": 0, }, }, }, - "range": Object { - "end": Object { - "character": 3, + "range": { + "end": { + "character": 4, "line": 3, }, - "start": Object { - "character": 21, + "start": { + "character": 11, "line": 0, }, }, }, - "range": Object { - "end": Object { - "character": 39, - "line": 2, + "range": { + "end": { + "character": 3, + "line": 3, }, - "start": Object { - "character": 2, - "line": 1, + "start": { + "character": 21, + "line": 0, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 39, "line": 2, }, - "start": Object { + "start": { "character": 2, "line": 2, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 39, "line": 2, }, - "start": Object { - "character": 14, + "start": { + "character": 2, "line": 2, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 39, "line": 2, }, - "start": Object { - "character": 16, + "start": { + "character": 14, "line": 2, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 39, "line": 2, }, - "start": Object { + "start": { "character": 20, "line": 2, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 28, "line": 2, }, - "start": Object { + "start": { "character": 20, "line": 2, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 28, "line": 2, }, - "start": Object { + "start": { "character": 23, "line": 2, }, }, }, ] -`)}); +`); + }); -it("returns a reasonable selection range for ill-typed modules", async () => { - openDocument(outdent` + it("returns a reasonable selection range for ill-typed modules", async () => { + openDocument(outdent` module M = struct let f x : int = string_of_int x end`); -let result = await selectionRange([Types.Position.create(1, 34)]); -expect(result).toMatchInlineSnapshot(` -Array [ - Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "range": Object { - "end": Object { + const result = await selectionRange([Types.Position.create(1, 34)]); + expect(result).toMatchInlineSnapshot(` +[ + { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "range": { + "end": { "character": 3, "line": 2, }, - "start": Object { + "start": { "character": 0, "line": 0, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 3, "line": 2, }, - "start": Object { + "start": { "character": 11, "line": 0, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 35, "line": 1, }, - "start": Object { + "start": { "character": 4, "line": 1, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 35, "line": 1, }, - "start": Object { + "start": { "character": 10, "line": 1, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 35, "line": 1, }, - "start": Object { + "start": { "character": 20, "line": 1, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 35, "line": 1, }, - "start": Object { + "start": { "character": 34, "line": 1, }, }, }, ] -`)}); +`); + }); -it("returns a reasonable selection range in the presence of syntax errors", async () => { - openDocument(outdent` + it("returns a reasonable selection range in the presence of syntax errors", async () => { + openDocument(outdent` module M = struct let f x : int = string_of_int x ed`); -let result = await selectionRange([Types.Position.create(1, 34)]); -expect(result).toMatchInlineSnapshot(` -Array [ - Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "parent": Object { - "range": Object { - "end": Object { + const result = await selectionRange([Types.Position.create(1, 34)]); + expect(result).toMatchInlineSnapshot(` +[ + { + "parent": { + "parent": { + "parent": { + "parent": { + "parent": { + "range": { + "end": { "character": 2, "line": 2, }, - "start": Object { + "start": { "character": 0, "line": 0, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 2, "line": 2, }, - "start": Object { + "start": { "character": 11, "line": 0, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 2, "line": 2, }, - "start": Object { + "start": { "character": 4, "line": 1, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 2, "line": 2, }, - "start": Object { + "start": { "character": 10, "line": 1, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 2, "line": 2, }, - "start": Object { + "start": { "character": 20, "line": 1, }, }, }, - "range": Object { - "end": Object { + "range": { + "end": { "character": 35, "line": 1, }, - "start": Object { + "start": { "character": 34, "line": 1, }, }, }, ] -`)}); +`); + }); }); diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-signatureHelp.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-signatureHelp.ts index b96776d56..35a60b9e4 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-signatureHelp.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-signatureHelp.ts @@ -1,7 +1,7 @@ import outdent from "outdent"; -import * as LanguageServer from "./../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; import * as Types from "vscode-languageserver-types"; +import * as LanguageServer from "./../src/LanguageServer"; const describe_opt = LanguageServer.ocamlVersionGEq("4.08.0") ? describe @@ -64,23 +64,23 @@ describe_opt("textDocument/completion", () => { let _ = map `); - let items = await querySignatureHelp(Types.Position.create(2, 11)); + const items = await querySignatureHelp(Types.Position.create(2, 11)); expect(items).toMatchInlineSnapshot(` -Object { +{ "activeParameter": 1, "activeSignature": 0, - "signatures": Array [ - Object { + "signatures": [ + { "label": "map : f:('a -> 'b) -> 'a list -> 'b list", - "parameters": Array [ - Object { - "label": Array [ + "parameters": [ + { + "label": [ 6, 18, ], }, - Object { - "label": Array [ + { + "label": [ 22, 29, ], @@ -99,23 +99,23 @@ Object { let _ = 1 + 2 `); - let items = await querySignatureHelp(Types.Position.create(2, 13)); + const items = await querySignatureHelp(Types.Position.create(2, 13)); expect(items).toMatchInlineSnapshot(` -Object { +{ "activeParameter": 1, "activeSignature": 0, - "signatures": Array [ - Object { + "signatures": [ + { "label": "(+) : int -> int -> int", - "parameters": Array [ - Object { - "label": Array [ + "parameters": [ + { + "label": [ 6, 9, ], }, - Object { - "label": Array [ + { + "label": [ 13, 16, ], @@ -132,17 +132,17 @@ Object { let _ = (fun x -> x + 1) `); - let items = await querySignatureHelp(Types.Position.create(0, 26)); + const items = await querySignatureHelp(Types.Position.create(0, 26)); expect(items).toMatchInlineSnapshot(` -Object { +{ "activeParameter": 0, "activeSignature": 0, - "signatures": Array [ - Object { + "signatures": [ + { "label": "_ : int -> int", - "parameters": Array [ - Object { - "label": Array [ + "parameters": [ + { + "label": [ 4, 7, ], @@ -161,23 +161,23 @@ Object { let _ = map [] `); - let items = await querySignatureHelp(Types.Position.create(2, 14)); + const items = await querySignatureHelp(Types.Position.create(2, 14)); expect(items).toMatchInlineSnapshot(` -Object { +{ "activeParameter": 1, "activeSignature": 0, - "signatures": Array [ - Object { + "signatures": [ + { "label": "map : f:('a -> 'b) -> 'a list -> 'b list", - "parameters": Array [ - Object { - "label": Array [ + "parameters": [ + { + "label": [ 6, 18, ], }, - Object { - "label": Array [ + { + "label": [ 22, 29, ], @@ -196,23 +196,23 @@ Object { let _ = map ~f:Int.abs `); - let items = await querySignatureHelp(Types.Position.create(2, 22)); + const items = await querySignatureHelp(Types.Position.create(2, 22)); expect(items).toMatchInlineSnapshot(` -Object { +{ "activeParameter": 0, "activeSignature": 0, - "signatures": Array [ - Object { + "signatures": [ + { "label": "map : f:(int -> int) -> int list -> int list", - "parameters": Array [ - Object { - "label": Array [ + "parameters": [ + { + "label": [ 6, 20, ], }, - Object { - "label": Array [ + { + "label": [ 24, 32, ], @@ -231,23 +231,23 @@ Object { let _ = mem ~se `); - let items = await querySignatureHelp(Types.Position.create(2, 15)); + const items = await querySignatureHelp(Types.Position.create(2, 15)); expect(items).toMatchInlineSnapshot(` -Object { +{ "activeParameter": 1, "activeSignature": 0, - "signatures": Array [ - Object { + "signatures": [ + { "label": "mem : 'a -> set:'a list -> bool", - "parameters": Array [ - Object { - "label": Array [ + "parameters": [ + { + "label": [ 6, 8, ], }, - Object { - "label": Array [ + { + "label": [ 12, 23, ], @@ -266,23 +266,23 @@ Object { let _ = create ?ra `); - let items = await querySignatureHelp(Types.Position.create(2, 18)); + const items = await querySignatureHelp(Types.Position.create(2, 18)); expect(items).toMatchInlineSnapshot(` -Object { +{ "activeParameter": 0, "activeSignature": 0, - "signatures": Array [ - Object { + "signatures": [ + { "label": "create : ?random:bool -> int -> ('a, 'b) Hashtbl.t", - "parameters": Array [ - Object { - "label": Array [ + "parameters": [ + { + "label": [ 9, 21, ], }, - Object { - "label": Array [ + { + "label": [ 25, 28, ], @@ -380,14 +380,14 @@ Object { `, ); - let items = await querySignatureHelp(Types.Position.create(80, 13)); + const items = await querySignatureHelp(Types.Position.create(80, 13)); expect(items).toMatchInlineSnapshot(` -Object { +{ "activeParameter": 0, "activeSignature": 0, - "signatures": Array [ - Object { - "documentation": Object { + "signatures": [ + { + "documentation": { "kind": "markdown", "value": "This is an example of a docstring that demonstrates various ocamldoc syntax features. @@ -409,7 +409,7 @@ Cross-references: \`List.length\` Replacement text #### Inline Formatting -**Bold**, *Italic*, *Emphasize*, ^{Superscript}, \\\\_{Subscript}, and \`inline code\` +**Bold**, *Italic*, *Emphasize*, ^{Superscript}, \\_{Subscript}, and \`inline code\` #### Text Alignment @@ -466,7 +466,7 @@ dividend ***@raise*** \`Division_by_zero\` raised when divided by zero -***@see*** [link](https://en.wikipedia.org/wiki/Arithmetic#Division_\\\\(%C3%B7,_or_/\\\\)) +***@see*** [link](https://en.wikipedia.org/wiki/Arithmetic#Division_\\(%C3%B7,_or_/\\)) article ***@see*** \`arithmetic.ml\` @@ -484,15 +484,15 @@ use \`(/)\` ***@author*** John Doe", }, "label": "div : int -> int -> int", - "parameters": Array [ - Object { - "label": Array [ + "parameters": [ + { + "label": [ 6, 9, ], }, - Object { - "label": Array [ + { + "label": [ 13, 16, ], diff --git a/ocaml-lsp-server/test/e2e/__tests__/textDocument-typeDefinition.test.ts b/ocaml-lsp-server/test/e2e/__tests__/textDocument-typeDefinition.test.ts index 43f4746b3..1f411d489 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/textDocument-typeDefinition.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/textDocument-typeDefinition.test.ts @@ -1,9 +1,9 @@ import outdent from "outdent"; -import * as LanguageServer from "./../src/LanguageServer"; -import * as Types from "vscode-languageserver-types"; -import { testUri } from "./../src/LanguageServer"; import * as Protocol from "vscode-languageserver-protocol"; +import * as Types from "vscode-languageserver-types"; import { isNotNullable } from "../src/utils"; +import * as LanguageServer from "./../src/LanguageServer"; +import { testUri } from "./../src/LanguageServer"; describe("textDocument/definition", () => { let languageServer: LanguageServer.LanguageServer; @@ -56,17 +56,17 @@ describe("textDocument/definition", () => { let x = T 43 `); - let result = await queryDefinition(Types.Position.create(3, 4)); + const result = await queryDefinition(Types.Position.create(3, 4)); expect(result.length).toBe(1); expect(result[0].range).toMatchInlineSnapshot(` -Object { - "end": Object { - "character": 0, +{ + "end": { + "character": 5, "line": 1, }, - "start": Object { - "character": 0, + "start": { + "character": 5, "line": 1, }, } @@ -83,17 +83,17 @@ Object { let x = T 43 `); - let result = await queryDefinition(Types.Position.create(4, 4)); + const result = await queryDefinition(Types.Position.create(4, 4)); expect(result.length).toBe(1); expect(result[0].range).toMatchInlineSnapshot(` -Object { - "end": Object { - "character": 0, +{ + "end": { + "character": 5, "line": 1, }, - "start": Object { - "character": 0, + "start": { + "character": 5, "line": 1, }, } @@ -109,17 +109,17 @@ Object { let t = T 42 `); - let result = await queryDefinition(Types.Position.create(3, 4)); + const result = await queryDefinition(Types.Position.create(3, 4)); expect(result.length).toBe(1); expect(result[0].range).toMatchInlineSnapshot(` -Object { - "end": Object { - "character": 0, +{ + "end": { + "character": 5, "line": 1, }, - "start": Object { - "character": 0, + "start": { + "character": 5, "line": 1, }, } diff --git a/ocaml-lsp-server/test/e2e/__tests__/workspace-symbol.test.ts b/ocaml-lsp-server/test/e2e/__tests__/workspace-symbol.test.ts index 7d77fa570..b827f7a8d 100644 --- a/ocaml-lsp-server/test/e2e/__tests__/workspace-symbol.test.ts +++ b/ocaml-lsp-server/test/e2e/__tests__/workspace-symbol.test.ts @@ -1,15 +1,15 @@ -import * as path from "path"; -import * as child_process from "child_process"; -import * as Types from "vscode-languageserver-types"; +import * as child_process from "node:child_process"; +import * as path from "node:path"; import * as Protocol from "vscode-languageserver-protocol"; -import * as LanguageServer from "./../src/LanguageServer"; +import * as Types from "vscode-languageserver-types"; import { URI } from "vscode-uri"; +import * as LanguageServer from "./../src/LanguageServer"; -let createWorkspaces = (names: string[]) => { - let createSingleWorkspace = (name: string) => { - let workspacePath = path.join(__dirname, name); - let uri = LanguageServer.toURI(workspacePath); - let folder: Protocol.WorkspaceFolder = { name, uri }; +const createWorkspaces = (names: string[]) => { + const createSingleWorkspace = (name: string) => { + const workspacePath = path.join(__dirname, name); + const uri = LanguageServer.toURI(workspacePath); + const folder: Protocol.WorkspaceFolder = { name, uri }; return { name, path: workspacePath, @@ -18,9 +18,9 @@ let createWorkspaces = (names: string[]) => { }; }; - let workspaces = names.map(createSingleWorkspace); + const workspaces = names.map(createSingleWorkspace); - let toTestResult = ( + const toTestResult = ( symbol: Types.SymbolInformation | Types.WorkspaceSymbol, ) => { const location = Types.Location.is(symbol.location) @@ -46,14 +46,14 @@ let createWorkspaces = (names: string[]) => { }; }; -let buildProject = (cwd: string): void => { +const buildProject = (cwd: string): void => { child_process.execSync("dune build --root . @check", { cwd: cwd }); }; describe("workspace/symbol", () => { let languageServer: LanguageServer.LanguageServer; - let { + const { workspaces: [workspaceA, workspaceB], toTestResult, } = createWorkspaces(["workspace_symbol_A", "workspace_symbol_B"]); @@ -78,52 +78,51 @@ describe("workspace/symbol", () => { buildProject(workspaceA.path); - let symbols = await queryWorkspaceSymbol({ + const symbols = await queryWorkspaceSymbol({ query: "", }); expect(symbols.map(toTestResult)).toMatchInlineSnapshot(` - Array [ - "stack_of_ints 5 /workspace_symbol_A/bin/a.ml 51:0 65:5", - "size 6 /workspace_symbol_A/bin/a.ml 64:11 64:15", - "peek 6 /workspace_symbol_A/bin/a.ml 62:11 62:15", - "pop 6 /workspace_symbol_A/bin/a.ml 57:11 57:14", - "push 6 /workspace_symbol_A/bin/a.ml 55:11 55:15", - "the_list 12 /workspace_symbol_A/bin/a.ml 53:16 53:24", - "Foo 9 /workspace_symbol_A/bin/a.ml 49:0 49:23", - "Increment 2 /workspace_symbol_A/bin/a.ml 45:0 47:3", - "increment_x 12 /workspace_symbol_A/bin/a.ml 46:2 46:27", - "X_int 2 /workspace_symbol_A/bin/a.ml 41:0 43:3", - "x 12 /workspace_symbol_A/bin/a.ml 42:2 42:13", - "A_Mod 2 /workspace_symbol_A/bin/a.ml 29:0 39:3", - "compare 12 /workspace_symbol_A/bin/a.ml 38:2 38:30", - "private_mod_fn 12 /workspace_symbol_A/bin/a.ml 36:2 36:33", - "t 15 /workspace_symbol_A/bin/a.ml 34:2 34:14", - "My_string 2 /workspace_symbol_A/bin/a.ml 27:0 27:25", - "StringMap 2 /workspace_symbol_A/bin/a.ml 26:0 26:36", - "a_i 12 /workspace_symbol_A/bin/a.ml 22:0 24:7", - "a_arr 12 /workspace_symbol_A/bin/a.ml 18:0 18:14", - "a_u 12 /workspace_symbol_A/bin/a.ml 16:0 16:15", - "user 15 /workspace_symbol_A/bin/a.ml 12:0 14:12", - "NotAdmin 9 /workspace_symbol_A/bin/a.ml 14:2 14:12", - "Admin 9 /workspace_symbol_A/bin/a.ml 13:2 13:9", - "a_d 12 /workspace_symbol_A/bin/a.ml 7:0 10:14", - "A_B 2 /workspace_symbol_A/bin/a.ml 2:0 5:3", - "a_b 12 /workspace_symbol_A/bin/a.ml 4:2 4:19", - "a_b_t 15 /workspace_symbol_A/bin/a.ml 3:2 3:21", - "a_x 12 /workspace_symbol_A/bin/a.ml 0:0 0:11", - "main_y 12 /workspace_symbol_A/bin/main.ml 0:0 0:22", - "vendored_x 12 /workspace_symbol_A/lib/lib.ml 14:0 14:31", - "lib_type 12 /workspace_symbol_A/lib/lib.ml 12:0 12:38", - "lib_private_fn 12 /workspace_symbol_A/lib/lib.ml 10:0 10:38", - "hd 12 /workspace_symbol_A/lib/lib.ml 8:0 8:16", - "lib_x 12 /workspace_symbol_A/lib/lib.ml 6:0 6:14", - "user 15 /workspace_symbol_A/lib/lib.ml 3:0 5:1", - "name 7 /workspace_symbol_A/lib/lib.ml 4:2 4:14", - "t 15 /workspace_symbol_A/lib/LibTypes.mli 0:0 0:15", - "x 12 /workspace_symbol_A/vendor/vendored_lib.ml 0:0 0:9", - ] - `); +[ + "stack_of_ints 5 /workspace_symbol_A/bin/a.ml 51:0 65:5", + "size 6 /workspace_symbol_A/bin/a.ml 64:4 64:38", + "peek 6 /workspace_symbol_A/bin/a.ml 62:4 62:34", + "pop 6 /workspace_symbol_A/bin/a.ml 57:4 60:12", + "push 6 /workspace_symbol_A/bin/a.ml 55:4 55:45", + "the_list 12 /workspace_symbol_A/bin/a.ml 53:4 53:40", + "Foo 9 /workspace_symbol_A/bin/a.ml 49:0 49:23", + "Increment 2 /workspace_symbol_A/bin/a.ml 45:0 47:3", + "increment_x 12 /workspace_symbol_A/bin/a.ml 46:2 46:27", + "X_int 2 /workspace_symbol_A/bin/a.ml 41:0 43:3", + "x 12 /workspace_symbol_A/bin/a.ml 42:2 42:13", + "A_Mod 2 /workspace_symbol_A/bin/a.ml 29:0 39:3", + "compare 12 /workspace_symbol_A/bin/a.ml 38:2 38:30", + "private_mod_fn 12 /workspace_symbol_A/bin/a.ml 36:2 36:33", + "t 15 /workspace_symbol_A/bin/a.ml 34:2 34:14", + "My_string 2 /workspace_symbol_A/bin/a.ml 27:0 27:25", + "StringMap 2 /workspace_symbol_A/bin/a.ml 26:0 26:36", + "a_i 12 /workspace_symbol_A/bin/a.ml 22:0 24:7", + "a_arr 12 /workspace_symbol_A/bin/a.ml 18:0 18:14", + "a_u 12 /workspace_symbol_A/bin/a.ml 16:0 16:15", + "user 15 /workspace_symbol_A/bin/a.ml 12:0 14:12", + "NotAdmin 9 /workspace_symbol_A/bin/a.ml 14:2 14:12", + "Admin 9 /workspace_symbol_A/bin/a.ml 13:2 13:9", + "a_d 12 /workspace_symbol_A/bin/a.ml 7:0 10:14", + "A_B 2 /workspace_symbol_A/bin/a.ml 2:0 5:3", + "a_b 12 /workspace_symbol_A/bin/a.ml 4:2 4:19", + "a_b_t 15 /workspace_symbol_A/bin/a.ml 3:2 3:21", + "a_x 12 /workspace_symbol_A/bin/a.ml 0:0 0:11", + "main_y 12 /workspace_symbol_A/bin/main.ml 0:0 0:22", + "vendored_x 12 /workspace_symbol_A/lib/lib.ml 14:0 14:31", + "lib_private_fn 12 /workspace_symbol_A/lib/lib.ml 10:0 10:38", + "hd 12 /workspace_symbol_A/lib/lib.ml 8:0 8:16", + "lib_x 12 /workspace_symbol_A/lib/lib.ml 6:0 6:14", + "user 15 /workspace_symbol_A/lib/lib.ml 3:0 5:1", + "name 7 /workspace_symbol_A/lib/lib.ml 4:2 4:14", + "t 15 /workspace_symbol_A/lib/LibTypes.mli 0:0 0:15", + "x 12 /workspace_symbol_A/vendor/vendored_lib.ml 0:0 0:9", +] +`); }); it("returns filtered symbols from workspace", async () => { @@ -133,21 +132,21 @@ describe("workspace/symbol", () => { buildProject(workspaceA.path); - let symbols = await queryWorkspaceSymbol({ + const symbols = await queryWorkspaceSymbol({ query: "a_", }); expect(symbols.map(toTestResult)).toMatchInlineSnapshot(` - Array [ - "a_i 12 /workspace_symbol_A/bin/a.ml 22:0 24:7", - "a_arr 12 /workspace_symbol_A/bin/a.ml 18:0 18:14", - "a_u 12 /workspace_symbol_A/bin/a.ml 16:0 16:15", - "a_d 12 /workspace_symbol_A/bin/a.ml 7:0 10:14", - "a_b 12 /workspace_symbol_A/bin/a.ml 4:2 4:19", - "a_b_t 15 /workspace_symbol_A/bin/a.ml 3:2 3:21", - "a_x 12 /workspace_symbol_A/bin/a.ml 0:0 0:11", - ] - `); +[ + "a_i 12 /workspace_symbol_A/bin/a.ml 22:0 24:7", + "a_arr 12 /workspace_symbol_A/bin/a.ml 18:0 18:14", + "a_u 12 /workspace_symbol_A/bin/a.ml 16:0 16:15", + "a_d 12 /workspace_symbol_A/bin/a.ml 7:0 10:14", + "a_b 12 /workspace_symbol_A/bin/a.ml 4:2 4:19", + "a_b_t 15 /workspace_symbol_A/bin/a.ml 3:2 3:21", + "a_x 12 /workspace_symbol_A/bin/a.ml 0:0 0:11", +] +`); }); it("handles mutiple wokspaces", async () => { @@ -158,53 +157,52 @@ describe("workspace/symbol", () => { buildProject(workspaceA.path); buildProject(workspaceB.path); - let symbols = await queryWorkspaceSymbol({ + const symbols = await queryWorkspaceSymbol({ query: "", }); expect(symbols.map(toTestResult)).toMatchInlineSnapshot(` - Array [ - "stack_of_ints 5 /workspace_symbol_A/bin/a.ml 51:0 65:5", - "size 6 /workspace_symbol_A/bin/a.ml 64:11 64:15", - "peek 6 /workspace_symbol_A/bin/a.ml 62:11 62:15", - "pop 6 /workspace_symbol_A/bin/a.ml 57:11 57:14", - "push 6 /workspace_symbol_A/bin/a.ml 55:11 55:15", - "the_list 12 /workspace_symbol_A/bin/a.ml 53:16 53:24", - "Foo 9 /workspace_symbol_A/bin/a.ml 49:0 49:23", - "Increment 2 /workspace_symbol_A/bin/a.ml 45:0 47:3", - "increment_x 12 /workspace_symbol_A/bin/a.ml 46:2 46:27", - "X_int 2 /workspace_symbol_A/bin/a.ml 41:0 43:3", - "x 12 /workspace_symbol_A/bin/a.ml 42:2 42:13", - "A_Mod 2 /workspace_symbol_A/bin/a.ml 29:0 39:3", - "compare 12 /workspace_symbol_A/bin/a.ml 38:2 38:30", - "private_mod_fn 12 /workspace_symbol_A/bin/a.ml 36:2 36:33", - "t 15 /workspace_symbol_A/bin/a.ml 34:2 34:14", - "My_string 2 /workspace_symbol_A/bin/a.ml 27:0 27:25", - "StringMap 2 /workspace_symbol_A/bin/a.ml 26:0 26:36", - "a_i 12 /workspace_symbol_A/bin/a.ml 22:0 24:7", - "a_arr 12 /workspace_symbol_A/bin/a.ml 18:0 18:14", - "a_u 12 /workspace_symbol_A/bin/a.ml 16:0 16:15", - "user 15 /workspace_symbol_A/bin/a.ml 12:0 14:12", - "NotAdmin 9 /workspace_symbol_A/bin/a.ml 14:2 14:12", - "Admin 9 /workspace_symbol_A/bin/a.ml 13:2 13:9", - "a_d 12 /workspace_symbol_A/bin/a.ml 7:0 10:14", - "A_B 2 /workspace_symbol_A/bin/a.ml 2:0 5:3", - "a_b 12 /workspace_symbol_A/bin/a.ml 4:2 4:19", - "a_b_t 15 /workspace_symbol_A/bin/a.ml 3:2 3:21", - "a_x 12 /workspace_symbol_A/bin/a.ml 0:0 0:11", - "main_y 12 /workspace_symbol_A/bin/main.ml 0:0 0:22", - "vendored_x 12 /workspace_symbol_A/lib/lib.ml 14:0 14:31", - "lib_type 12 /workspace_symbol_A/lib/lib.ml 12:0 12:38", - "lib_private_fn 12 /workspace_symbol_A/lib/lib.ml 10:0 10:38", - "hd 12 /workspace_symbol_A/lib/lib.ml 8:0 8:16", - "lib_x 12 /workspace_symbol_A/lib/lib.ml 6:0 6:14", - "user 15 /workspace_symbol_A/lib/lib.ml 3:0 5:1", - "name 7 /workspace_symbol_A/lib/lib.ml 4:2 4:14", - "t 15 /workspace_symbol_A/lib/LibTypes.mli 0:0 0:15", - "x 12 /workspace_symbol_A/vendor/vendored_lib.ml 0:0 0:9", - "workspace_B 12 /workspace_symbol_B/main.ml 0:0 0:31", - ] - `); +[ + "stack_of_ints 5 /workspace_symbol_A/bin/a.ml 51:0 65:5", + "size 6 /workspace_symbol_A/bin/a.ml 64:4 64:38", + "peek 6 /workspace_symbol_A/bin/a.ml 62:4 62:34", + "pop 6 /workspace_symbol_A/bin/a.ml 57:4 60:12", + "push 6 /workspace_symbol_A/bin/a.ml 55:4 55:45", + "the_list 12 /workspace_symbol_A/bin/a.ml 53:4 53:40", + "Foo 9 /workspace_symbol_A/bin/a.ml 49:0 49:23", + "Increment 2 /workspace_symbol_A/bin/a.ml 45:0 47:3", + "increment_x 12 /workspace_symbol_A/bin/a.ml 46:2 46:27", + "X_int 2 /workspace_symbol_A/bin/a.ml 41:0 43:3", + "x 12 /workspace_symbol_A/bin/a.ml 42:2 42:13", + "A_Mod 2 /workspace_symbol_A/bin/a.ml 29:0 39:3", + "compare 12 /workspace_symbol_A/bin/a.ml 38:2 38:30", + "private_mod_fn 12 /workspace_symbol_A/bin/a.ml 36:2 36:33", + "t 15 /workspace_symbol_A/bin/a.ml 34:2 34:14", + "My_string 2 /workspace_symbol_A/bin/a.ml 27:0 27:25", + "StringMap 2 /workspace_symbol_A/bin/a.ml 26:0 26:36", + "a_i 12 /workspace_symbol_A/bin/a.ml 22:0 24:7", + "a_arr 12 /workspace_symbol_A/bin/a.ml 18:0 18:14", + "a_u 12 /workspace_symbol_A/bin/a.ml 16:0 16:15", + "user 15 /workspace_symbol_A/bin/a.ml 12:0 14:12", + "NotAdmin 9 /workspace_symbol_A/bin/a.ml 14:2 14:12", + "Admin 9 /workspace_symbol_A/bin/a.ml 13:2 13:9", + "a_d 12 /workspace_symbol_A/bin/a.ml 7:0 10:14", + "A_B 2 /workspace_symbol_A/bin/a.ml 2:0 5:3", + "a_b 12 /workspace_symbol_A/bin/a.ml 4:2 4:19", + "a_b_t 15 /workspace_symbol_A/bin/a.ml 3:2 3:21", + "a_x 12 /workspace_symbol_A/bin/a.ml 0:0 0:11", + "main_y 12 /workspace_symbol_A/bin/main.ml 0:0 0:22", + "vendored_x 12 /workspace_symbol_A/lib/lib.ml 14:0 14:31", + "lib_private_fn 12 /workspace_symbol_A/lib/lib.ml 10:0 10:38", + "hd 12 /workspace_symbol_A/lib/lib.ml 8:0 8:16", + "lib_x 12 /workspace_symbol_A/lib/lib.ml 6:0 6:14", + "user 15 /workspace_symbol_A/lib/lib.ml 3:0 5:1", + "name 7 /workspace_symbol_A/lib/lib.ml 4:2 4:14", + "t 15 /workspace_symbol_A/lib/LibTypes.mli 0:0 0:15", + "x 12 /workspace_symbol_A/vendor/vendored_lib.ml 0:0 0:9", + "workspace_B 12 /workspace_symbol_B/main.ml 0:0 0:31", +] +`); }); it("shows a notification message if no build directory found", async () => { @@ -217,7 +215,7 @@ describe("workspace/symbol", () => { type StarNotificationHandlerParams = Parameters; - let receivedNotification: Promise<{ + const receivedNotification: Promise<{ method: StarNotificationHandlerParams[0]; params: StarNotificationHandlerParams[1]; }> = new Promise((resolve, _reject) => @@ -230,7 +228,7 @@ describe("workspace/symbol", () => { query: "", }); - let notification = await receivedNotification; + const notification = await receivedNotification; expect(notification.method).toBe( Protocol.ShowMessageNotification.type.method, ); diff --git a/ocaml-lsp-server/test/e2e/jest.config.js b/ocaml-lsp-server/test/e2e/jest.config.js index ba0385530..548ecd402 100644 --- a/ocaml-lsp-server/test/e2e/jest.config.js +++ b/ocaml-lsp-server/test/e2e/jest.config.js @@ -2,13 +2,10 @@ * @type {import('@jest/types').Config.ProjectConfig} */ module.exports = { - preset: "ts-jest", roots: [""], + setupFilesAfterEnv: ["./jest.setup.ts"], testEnvironment: "node", transform: { - "^.+\\.tsx?$": "ts-jest", + "^.+\\.tsx?$": "@swc/jest", }, - testRegex: "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", - moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], - setupFilesAfterEnv: ["./jest.setup.ts"], }; diff --git a/ocaml-lsp-server/test/e2e/package.json b/ocaml-lsp-server/test/e2e/package.json index 1fc8c7f41..d1bbe8f31 100644 --- a/ocaml-lsp-server/test/e2e/package.json +++ b/ocaml-lsp-server/test/e2e/package.json @@ -1,20 +1,22 @@ { - "name": "ocaml-lsp", + "name": "@ocaml/ocaml-lsp-server-e2e", + "version": "0.0.0", "private": true, "scripts": { - "test": "jest", - "promote": "jest --updateSnapshot" + "promote": "jest --updateSnapshot", + "test": "jest" }, "dependencies": { "outdent": "0.8.0", - "vscode-uri": "^3.0.8" + "vscode-uri": "3.0.8" }, "devDependencies": { - "@types/jest": "28.1.3", - "@types/node": "^20.14.9", - "jest": "28.1.1", - "ts-jest": "28.0.5", - "typescript": "5.4.5", + "@swc/core": "1.10.1", + "@swc/jest": "0.2.37", + "@types/jest": "29.5.14", + "@types/node": "22.10.2", + "jest": "29.7.0", + "typescript": "5.7.2", "vscode-jsonrpc": "8.0.1", "vscode-languageserver-protocol": "3.17.1", "vscode-languageserver-types": "3.17.5" diff --git a/ocaml-lsp-server/test/e2e/src/LanguageServer.ts b/ocaml-lsp-server/test/e2e/src/LanguageServer.ts index d33ce12f7..86870dea9 100644 --- a/ocaml-lsp-server/test/e2e/src/LanguageServer.ts +++ b/ocaml-lsp-server/test/e2e/src/LanguageServer.ts @@ -1,8 +1,7 @@ -import * as cp from "child_process"; -import * as os from "os"; -import * as path from "path"; +import * as cp from "node:child_process"; +import * as os from "node:os"; +import * as path from "node:path"; import * as rpc from "vscode-jsonrpc/node"; - import * as Protocol from "vscode-languageserver-protocol"; import { URI } from "vscode-uri"; @@ -11,9 +10,9 @@ export function ocamlVersionGEq(versString: string) { return ocamlVersion >= versString; } -let serverBin = os.platform() === "win32" ? "ocamllsp.exe" : "ocamllsp"; +const serverBin = os.platform() === "win32" ? "ocamllsp.exe" : "ocamllsp"; -let serverPath = path.join( +const serverPath = path.join( __dirname, "..", "..", @@ -33,13 +32,13 @@ export const toURI = (s: string) => { }; export const start = (opts?: cp.SpawnOptions) => { - let env = { ...process.env }; + const env = { ...process.env }; env.OCAMLLSP_TEST = "true"; env.LEV_DEBUG = "1"; opts = opts || { env: env }; - let childProcess = cp.spawn(serverPath, [], opts); + const childProcess = cp.spawn(serverPath, [], opts); - let connection = rpc.createMessageConnection( + const connection = rpc.createMessageConnection( new rpc.StreamMessageReader(childProcess.stdout!), new rpc.StreamMessageWriter(childProcess.stdin!), ); @@ -58,7 +57,7 @@ export const start = (opts?: cp.SpawnOptions) => { export const startAndInitialize = async ( initializeParameters: Partial = {}, ) => { - let languageServer = start(); + const languageServer = start(); initializeParameters = { processId: process.pid, @@ -82,14 +81,14 @@ export const startAndInitialize = async ( }; export const exit = async (languageServer: rpc.MessageConnection) => { - let ret = new Promise((resolve, _reject) => { + const ret = new Promise((resolve, _reject) => { languageServer.onClose(() => { languageServer.dispose(); resolve(null); }); }); - let notification = new rpc.NotificationType("exit"); + const notification = new rpc.NotificationType("exit"); languageServer.sendNotification(notification); return ret; @@ -103,12 +102,10 @@ export const toEqualUri: jest.CustomMatcher = function ( received: string, expected: string, ) { - const obj = this; - const options = { comment: "Uri equality", - isNot: obj.isNot, - promise: obj.promise, + isNot: this.isNot, + promise: this.promise, }; const pass = @@ -116,14 +113,14 @@ export const toEqualUri: jest.CustomMatcher = function ( const message = pass ? () => - obj.utils.matcherHint("toEqualUri", undefined, undefined, options) + + this.utils.matcherHint("toEqualUri", undefined, undefined, options) + "\n\n" + - `Expected: not ${obj.utils.printExpected(expected)}\n` + - `Received: ${obj.utils.printReceived(received)}` + `Expected: not ${this.utils.printExpected(expected)}\n` + + `Received: ${this.utils.printReceived(received)}` : () => - obj.utils.matcherHint("toBe", undefined, undefined, options) + + this.utils.matcherHint("toBe", undefined, undefined, options) + "\n\n" + - `Expected: ${obj.utils.printExpected(expected)}\n` + - `Received: ${obj.utils.printReceived(received)}`; + `Expected: ${this.utils.printExpected(expected)}\n` + + `Received: ${this.utils.printReceived(received)}`; return { pass, message }; }; diff --git a/ocaml-lsp-server/test/e2e/src/Ocamlformat.js b/ocaml-lsp-server/test/e2e/src/Ocamlformat.js index 24ccaba22..971a35404 100644 --- a/ocaml-lsp-server/test/e2e/src/Ocamlformat.js +++ b/ocaml-lsp-server/test/e2e/src/Ocamlformat.js @@ -1,13 +1,13 @@ #!/usr/bin/env node -var chunks = []; +const chunks = []; process.stdin.resume(); -process.stdin.on("data", function (chunk) { +process.stdin.on("data", (chunk) => { chunks.push(chunk); }); -process.stdin.on("end", function () { - var body = Buffer.concat(chunks); - if (body == "special string") { +process.stdin.on("end", () => { + const body = Buffer.concat(chunks); + if (body === "special string") { process.stderr.write("special string passed\n"); process.exit(1); } else { diff --git a/ocaml-lsp-server/test/e2e/src/Refmt.js b/ocaml-lsp-server/test/e2e/src/Refmt.js index 24ccaba22..971a35404 100644 --- a/ocaml-lsp-server/test/e2e/src/Refmt.js +++ b/ocaml-lsp-server/test/e2e/src/Refmt.js @@ -1,13 +1,13 @@ #!/usr/bin/env node -var chunks = []; +const chunks = []; process.stdin.resume(); -process.stdin.on("data", function (chunk) { +process.stdin.on("data", (chunk) => { chunks.push(chunk); }); -process.stdin.on("end", function () { - var body = Buffer.concat(chunks); - if (body == "special string") { +process.stdin.on("end", () => { + const body = Buffer.concat(chunks); + if (body === "special string") { process.stderr.write("special string passed\n"); process.exit(1); } else { diff --git a/package.json b/package.json new file mode 100644 index 000000000..7a32c25bf --- /dev/null +++ b/package.json @@ -0,0 +1,11 @@ +{ + "name": "@ocaml/ocaml-lsp", + "private": true, + "workspaces": [ + "ocaml-lsp-server/test/e2e" + ], + "devDependencies": { + "@biomejs/biome": "1.9.4" + }, + "packageManager": "yarn@1.22.22" +} diff --git a/ocaml-lsp-server/test/e2e/yarn.lock b/yarn.lock similarity index 54% rename from ocaml-lsp-server/test/e2e/yarn.lock rename to yarn.lock index 831f91d3f..8303057db 100644 --- a/ocaml-lsp-server/test/e2e/yarn.lock +++ b/yarn.lock @@ -2,163 +2,122 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.20.0": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" - integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" - integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.5" - "@babel/parser" "^7.20.5" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - convert-source-map "^1.7.0" +"@babel/compat-data@^7.25.9": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@^7.20.5", "@babel/generator@^7.7.2": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" - integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== - dependencies: - "@babel/types" "^7.20.5" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" - integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== - dependencies: - "@babel/compat-data" "^7.20.0" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" - integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helpers@^7.20.5": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" - integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" - integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== + dependencies: + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== + dependencies: + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" + integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== + dependencies: + "@babel/types" "^7.26.3" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -174,14 +133,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -195,7 +168,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-jsx@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" + integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -209,7 +189,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -237,7 +217,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -245,51 +232,101 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/template@^7.18.10", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - -"@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.2": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" - integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.5" - "@babel/types" "^7.20.5" - debug "^4.1.0" + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/template@^7.25.9", "@babel/template@^7.3.3": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9": + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.3" + debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" - integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@biomejs/biome@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/biome/-/biome-1.9.4.tgz#89766281cbc3a0aae865a7ff13d6aaffea2842bf" + integrity sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "1.9.4" + "@biomejs/cli-darwin-x64" "1.9.4" + "@biomejs/cli-linux-arm64" "1.9.4" + "@biomejs/cli-linux-arm64-musl" "1.9.4" + "@biomejs/cli-linux-x64" "1.9.4" + "@biomejs/cli-linux-x64-musl" "1.9.4" + "@biomejs/cli-win32-arm64" "1.9.4" + "@biomejs/cli-win32-x64" "1.9.4" + +"@biomejs/cli-darwin-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz#dfa376d23a54a2d8f17133c92f23c1bf2e62509f" + integrity sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw== + +"@biomejs/cli-darwin-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz#eafc2ce3849d385fc02238aad1ca4a73395a64d9" + integrity sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg== + +"@biomejs/cli-linux-arm64-musl@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz#d780c3e01758fc90f3268357e3f19163d1f84fca" + integrity sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA== + +"@biomejs/cli-linux-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz#8ed1dd0e89419a4b66a47f95aefb8c46ae6041c9" + integrity sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g== + +"@biomejs/cli-linux-x64-musl@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz#f36982b966bd671a36671e1de4417963d7db15fb" + integrity sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg== + +"@biomejs/cli-linux-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz#a0a7f56680c76b8034ddc149dbf398bdd3a462e8" + integrity sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg== + +"@biomejs/cli-win32-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz#e2ef4e0084e76b7e26f0fc887c5ef1265ea56200" + integrity sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg== + +"@biomejs/cli-win32-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz#4c7afa90e3970213599b4095e62f87e5972b2340" + integrity sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -301,115 +338,122 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" -"@jest/core@^28.1.1", "@jest/core@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" - integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: - "@jest/console" "^28.1.3" - "@jest/reporters" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^28.1.3" - jest-config "^28.1.3" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-resolve-dependencies "^28.1.3" - jest-runner "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - jest-watcher "^28.1.3" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" micromatch "^4.0.4" - pretty-format "^28.1.3" - rimraf "^3.0.0" + pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" - integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== +"@jest/create-cache-key-function@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== + dependencies: + "@jest/types" "^29.6.3" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^28.1.3" + jest-mock "^29.7.0" -"@jest/expect-utils@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" - integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: - jest-get-type "^28.0.2" + jest-get-type "^29.6.3" -"@jest/expect@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" - integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: - expect "^28.1.3" - jest-snapshot "^28.1.3" + expect "^29.7.0" + jest-snapshot "^29.7.0" -"@jest/fake-timers@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" - integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: - "@jest/types" "^28.1.3" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-util "^28.1.3" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" -"@jest/globals@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" - integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" -"@jest/reporters@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" - integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - "@jridgewell/trace-mapping" "^0.3.13" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -417,240 +461,316 @@ glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" + istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - jest-worker "^28.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" - terminal-link "^2.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.27.8" -"@jest/source-map@^28.1.2": - version "28.1.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" - integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: - "@jridgewell/trace-mapping" "^0.3.13" + "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: - "@jest/console" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" - integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: - "@jest/test-result" "^28.1.3" + "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" + jest-haste-map "^29.7.0" slash "^3.0.0" -"@jest/transform@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" - integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^28.1.3" - "@jridgewell/trace-mapping" "^0.3.13" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^4.0.2" -"@jest/types@^28.1.1", "@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: - "@jest/schemas" "^28.1.3" + "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: - "@jridgewell/set-array" "^1.0.0" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@swc/core-darwin-arm64@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.1.tgz#faaaab19b4a039ae67ef661c0144a6f20fe8a78e" + integrity sha512-NyELPp8EsVZtxH/mEqvzSyWpfPJ1lugpTQcSlMduZLj1EASLO4sC8wt8hmL1aizRlsbjCX+r0PyL+l0xQ64/6Q== + +"@swc/core-darwin-x64@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.10.1.tgz#754600f453abd24471c202d48836f1161d798f49" + integrity sha512-L4BNt1fdQ5ZZhAk5qoDfUnXRabDOXKnXBxMDJ+PWLSxOGBbWE6aJTnu4zbGjJvtot0KM46m2LPAPY8ttknqaZA== + +"@swc/core-linux-arm-gnueabihf@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.1.tgz#b0f43c482d0d1819b382a4eb4a0733ce2e386257" + integrity sha512-Y1u9OqCHgvVp2tYQAJ7hcU9qO5brDMIrA5R31rwWQIAKDkJKtv3IlTHF0hrbWk1wPR0ZdngkQSJZple7G+Grvw== + +"@swc/core-linux-arm64-gnu@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.1.tgz#e02a9e22c25ba85ef00335742e549e06284cf33a" + integrity sha512-tNQHO/UKdtnqjc7o04iRXng1wTUXPgVd8Y6LI4qIbHVoVPwksZydISjMcilKNLKIwOoUQAkxyJ16SlOAeADzhQ== + +"@swc/core-linux-arm64-musl@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.1.tgz#3a0530af8f8bd3717f2f1bd8a2f5183fc58d4cf1" + integrity sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ== + +"@swc/core-linux-x64-gnu@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.1.tgz#5eb4d282b047a22896ab1d4627403be4c3e4fa6a" + integrity sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA== + +"@swc/core-linux-x64-musl@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.1.tgz#890f2eda3e67ccc6817cdd04eff91e6ad9e761c4" + integrity sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA== + +"@swc/core-win32-arm64-msvc@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.1.tgz#4ea7b2a2fab47f801d31ea8b001a141efaa5e6bf" + integrity sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ== + +"@swc/core-win32-ia32-msvc@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.1.tgz#729102669ccdb72e69884cce58e3686ac63d6f36" + integrity sha512-WalYdFoU3454Og+sDKHM1MrjvxUGwA2oralknXkXL8S0I/8RkWZOB++p3pLaGbTvOO++T+6znFbQdR8KRaa7DA== + +"@swc/core-win32-x64-msvc@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.1.tgz#7d665a7c69642861aed850ecb0cdf5d87197edda" + integrity sha512-JWobfQDbTnoqaIwPKQ3DVSywihVXlQMbDuwik/dDWlj33A8oEHcjPOGs4OqcA3RHv24i+lfCQpM3Mn4FAMfacA== + +"@swc/core@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.10.1.tgz#16b3b8284bafb0ecabb253925796883971e5a761" + integrity sha512-rQ4dS6GAdmtzKiCRt3LFVxl37FaY1cgL9kSUTnhQ2xc3fmHOd7jdJK/V4pSZMG1ruGTd0bsi34O2R0Olg9Zo/w== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.17" + optionalDependencies: + "@swc/core-darwin-arm64" "1.10.1" + "@swc/core-darwin-x64" "1.10.1" + "@swc/core-linux-arm-gnueabihf" "1.10.1" + "@swc/core-linux-arm64-gnu" "1.10.1" + "@swc/core-linux-arm64-musl" "1.10.1" + "@swc/core-linux-x64-gnu" "1.10.1" + "@swc/core-linux-x64-musl" "1.10.1" + "@swc/core-win32-arm64-msvc" "1.10.1" + "@swc/core-win32-ia32-msvc" "1.10.1" + "@swc/core-win32-x64-msvc" "1.10.1" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/jest@0.2.37": + version "0.2.37" + resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.37.tgz#9c2aaf22c87682aa968016e3e4843d1a25cae6bd" + integrity sha512-CR2BHhmXKGxTiFr21DYPRHQunLkX3mNIFGFkxBGji6r9uyIR5zftTOVYj1e0sFNMV2H7mf/+vpaglqaryBtqfQ== + dependencies: + "@jest/create-cache-key-function" "^29.7.0" + "@swc/counter" "^0.1.3" + jsonc-parser "^3.2.0" + +"@swc/types@^0.1.17": + version "0.1.17" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.17.tgz#bd1d94e73497f27341bf141abdf4c85230d41e7c" + integrity sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ== dependencies: - "@sinonjs/commons" "^1.7.0" + "@swc/counter" "^0.1.3" "@types/babel__core@^7.1.14": - version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" - integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.8" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" + integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" - integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.20.7" "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.3.tgz#52f3f3e50ce59191ff5fbb1084896cc0cf30c9ce" - integrity sha512-Tsbjk8Y2hkBaY/gJsataeb4q9Mubw9EOz7+4RjPkzD5KjTvHHs7cpws22InaoXxAVAhF5HfFbzJjo6oKWqSZLw== +"@types/jest@29.5.14": + version "29.5.14" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== dependencies: - jest-matcher-utils "^28.0.0" - pretty-format "^28.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" -"@types/node@*", "@types/node@^20.14.9": - version "20.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.9.tgz#12e8e765ab27f8c421a1820c99f5f313a933b420" - integrity sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== +"@types/node@*", "@types/node@22.10.2": + version "22.10.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" + integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== dependencies: - undici-types "~5.26.4" - -"@types/prettier@^2.1.5": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== + undici-types "~6.20.0" "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.17" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.17.tgz#5672e5621f8e0fca13f433a8017aae4b7a2a03e7" - integrity sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" @@ -666,13 +786,6 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -700,15 +813,15 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -babel-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" - integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: - "@jest/transform" "^28.1.3" + "@jest/transform" "^29.7.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^28.1.3" + babel-preset-jest "^29.6.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -724,10 +837,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" - integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -735,29 +848,32 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" -babel-preset-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" - integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: - babel-plugin-jest-hoist "^28.1.3" + babel-plugin-jest-hoist "^29.6.3" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -773,29 +889,22 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.2: +braces@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" -browserslist@^4.21.3: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.24.0: + version "4.24.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" + integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" + caniuse-lite "^1.0.30001669" + electron-to-chromium "^1.5.41" + node-releases "^2.0.18" + update-browserslist-db "^1.1.1" bser@2.1.1: version "2.1.1" @@ -824,19 +933,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001400: - version "1.0.30001439" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz#ab7371faeb4adff4b74dad1718a6fd122e45d9cb" - integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" +caniuse-lite@^1.0.30001669: + version "1.0.30001687" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz#d0ac634d043648498eedf7a3932836beba90ebae" + integrity sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ== chalk@^4.0.0: version "4.1.2" @@ -852,14 +952,14 @@ char-regex@^1.0.2: integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== ci-info@^3.2.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" - integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" - integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== cliui@^8.0.1: version "8.0.1" @@ -876,16 +976,9 @@ co@^4.6.0: integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^2.0.1: version "2.0.1" @@ -894,11 +987,6 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -909,56 +997,69 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -debug@^4.1.0, debug@^4.1.1: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: - ms "2.1.2" + ms "^2.1.3" -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.5.41: + version "1.5.72" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.72.tgz#a732805986d3a5b5fedd438ddf4616c7d78ac2df" + integrity sha512-ZpSAUOZ2Izby7qnZluSrAlGgGQzucmFbN0n64dYzocYxnxV5ufurpj3VgEe4cUp7ir9LmeLxNYo8bVnlM8bQHw== -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" @@ -972,15 +1073,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^2.0.0: version "2.0.0" @@ -1012,18 +1108,18 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" - integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - "@jest/expect-utils" "^28.1.3" - jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: +fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -1056,14 +1152,14 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" @@ -1103,26 +1199,21 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" html-escaper@^2.0.0: version "2.0.2" @@ -1135,9 +1226,9 @@ human-signals@^2.1.0: integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -1165,12 +1256,12 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.13.0: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - has "^1.0.3" + hasown "^2.0.2" is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -1198,11 +1289,11 @@ isexe@^2.0.0: integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: +istanbul-lib-instrument@^5.0.4: version "5.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== @@ -1213,13 +1304,24 @@ istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-instrument@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -1232,370 +1334,370 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" - integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" + jest-util "^29.7.0" p-limit "^3.1.0" -jest-circus@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" - integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - dedent "^0.7.0" + dedent "^1.0.0" is-generator-fn "^2.0.0" - jest-each "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" p-limit "^3.1.0" - pretty-format "^28.1.3" + pretty-format "^29.7.0" + pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^28.1.1: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" - integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: - "@jest/core" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" chalk "^4.0.0" + create-jest "^29.7.0" exit "^0.1.2" - graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - prompts "^2.0.1" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" yargs "^17.3.1" -jest-config@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" - integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.3" - "@jest/types" "^28.1.3" - babel-jest "^28.1.3" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^28.1.3" - jest-environment-node "^28.1.3" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-runner "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^28.1.3" + pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-docblock@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" - integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" -jest-each@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" - integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" chalk "^4.0.0" - jest-get-type "^28.0.2" - jest-util "^28.1.3" - pretty-format "^28.1.3" - -jest-environment-node@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" - integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" + jest-mock "^29.7.0" + jest-util "^29.7.0" -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-haste-map@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" - integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" - jest-worker "^28.1.3" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" - integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-matcher-utils@^28.0.0, jest-matcher-utils@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" - integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^28.1.3" + pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" - integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" "@types/node" "*" + jest-util "^29.7.0" jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== -jest-regex-util@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== -jest-resolve-dependencies@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" - integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: - jest-regex-util "^28.0.2" - jest-snapshot "^28.1.3" + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" -jest-resolve@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" - integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" + jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-util "^29.7.0" + jest-validate "^29.7.0" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" - integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: - "@jest/console" "^28.1.3" - "@jest/environment" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" - emittery "^0.10.2" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-docblock "^28.1.1" - jest-environment-node "^28.1.3" - jest-haste-map "^28.1.3" - jest-leak-detector "^28.1.3" - jest-message-util "^28.1.3" - jest-resolve "^28.1.3" - jest-runtime "^28.1.3" - jest-util "^28.1.3" - jest-watcher "^28.1.3" - jest-worker "^28.1.3" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" - integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/globals" "^28.1.3" - "@jest/source-map" "^28.1.2" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" - integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^28.1.3" + expect "^29.7.0" graceful-fs "^4.2.9" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - jest-haste-map "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" natural-compare "^1.4.0" - pretty-format "^28.1.3" - semver "^7.3.5" + pretty-format "^29.7.0" + semver "^7.5.3" -jest-util@^28.0.0, jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" - integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" - jest-get-type "^28.0.2" + jest-get-type "^29.6.3" leven "^3.1.0" - pretty-format "^28.1.3" + pretty-format "^29.7.0" -jest-watcher@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" + emittery "^0.13.1" + jest-util "^29.7.0" string-length "^4.0.1" -jest-worker@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" + jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.1.tgz#3c39a3a09791e16e9ef283597d24ab19a0df701e" - integrity sha512-qw9YHBnjt6TCbIDMPMpJZqf9E12rh6869iZaN08/vpOGgHJSAaLLUn6H8W3IAEuy34Ls3rct064mZLETkxJ2XA== +jest@29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: - "@jest/core" "^28.1.1" - "@jest/types" "^28.1.1" + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" import-local "^3.0.2" - jest-cli "^28.1.1" + jest-cli "^29.7.0" js-tokens@^4.0.0: version "4.0.0" @@ -1610,20 +1712,25 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json5@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" - integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== kleur@^3.0.3: version "3.0.3" @@ -1647,29 +1754,19 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: - yallist "^4.0.0" + yallist "^3.0.2" -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: - semver "^6.0.0" - -make-error@1.x: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + semver "^7.5.3" makeerror@1.0.12: version "1.0.12" @@ -1684,11 +1781,11 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mimic-fn@^2.1.0: @@ -1703,10 +1800,10 @@ minimatch@^3.0.4, minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== natural-compare@^1.4.0: version "1.4.0" @@ -1718,10 +1815,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.6: - version "2.0.7" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.7.tgz#593edbc7c22860ee4d32d3933cfebdfab0c0e0e5" - integrity sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ== +node-releases@^2.0.18: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== normalize-path@^3.0.0: version "3.0.0" @@ -1810,10 +1907,10 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -1821,9 +1918,9 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" @@ -1832,13 +1929,12 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pretty-format@^28.0.0, pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== +pretty-format@^29.0.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" + "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -1850,10 +1946,15 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== + react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== require-directory@^2.1.1: version "2.1.1" @@ -1872,39 +1973,30 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve.exports@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -rimraf@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -semver@7.x, semver@^7.3.5: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.5.3, semver@^7.5.4: + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -1996,14 +2088,7 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: +supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -2017,27 +2102,11 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -2052,11 +2121,6 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2064,20 +2128,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -ts-jest@28.0.5: - version "28.0.5" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.5.tgz#31776f768fba6dfc8c061d488840ed0c8eeac8b9" - integrity sha512-Sx9FyP9pCY7pUzQpy4FgRZf2bhHY3za576HMKJFs+OnQ9jS96Du5vNsDKkyedQkik+sEabbKAnCliv9BEsHZgQ== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^28.0.0" - json5 "^2.2.1" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "^21.0.1" - type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -2088,32 +2138,32 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@5.4.5: - version "5.4.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" - integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== +typescript@5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.2.0" + picocolors "^1.1.0" v8-to-istanbul@^9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" - integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" + convert-source-map "^2.0.0" vscode-jsonrpc@8.0.1: version "8.0.1" @@ -2138,7 +2188,7 @@ vscode-languageserver-types@3.17.5: resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== -vscode-uri@^3.0.8: +vscode-uri@3.0.8: version "3.0.8" resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== @@ -2171,7 +2221,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^4.0.1: +write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== @@ -2184,20 +2234,20 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yargs-parser@^21.0.1, yargs-parser@^21.1.1: +yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^17.3.1: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1"