From 184b1474350efe38164ecd43478b3d2c78d0370f Mon Sep 17 00:00:00 2001 From: Emilio Jesus Gallego Arias Date: Thu, 19 Oct 2023 17:18:53 +0200 Subject: [PATCH 01/10] [workspace] Support `-rifrom` option. Both in command line, `CoqProject`, and `fcc`. Fixes: #579 Thanks to Lasse Blaauwbroek for the report. --- CHANGES.md | 3 +++ compiler/fcc.ml | 17 +++++++++++++++-- controller/coq_lsp.ml | 18 ++++++++++++++++-- coq/workspace.ml | 32 +++++++++++++++++++++----------- coq/workspace.mli | 1 + examples/lists.mv | 17 ++++++++++++++++- test/CoqProject/_CoqProject | 1 + test/CoqProject/test.v | 2 ++ 8 files changed, 75 insertions(+), 16 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 6e8c18b6..4ee537b6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -39,6 +39,9 @@ - `coq-lsp` is now supported by the `coq-nix-toolbox` (@Zimmi48, @CohenCyril, #572, via https://github.com/coq-community/coq-nix-toolbox/pull/164 ) + - Support for `-rifrom` in `_CoqProject` and in command line + (`--rifrom`). Thanks to Lasse Blaauwbroek for the report. + (@ejgallego, #581, fixes #579) # coq-lsp 0.1.7: Just-in-time ----------------------------- diff --git a/compiler/fcc.ml b/compiler/fcc.ml index af22182c..f25c218f 100644 --- a/compiler/fcc.ml +++ b/compiler/fcc.ml @@ -3,7 +3,7 @@ open Cmdliner open Fcc_lib let fcc_main roots display debug plugins files coqlib coqcorelib ocamlpath - rload_path load_path = + rload_path load_path require_libraries = let vo_load_path = rload_path @ load_path in let ml_include_path = [] in let args = [] in @@ -14,6 +14,7 @@ let fcc_main roots display debug plugins files coqlib coqcorelib ocamlpath ; vo_load_path ; ml_include_path ; args + ; require_libraries } in let args = Args.{ cmdline; roots; display; files; debug; plugins } in @@ -98,6 +99,18 @@ let plugins : string list Term.t = let doc = "Compiler plugins to load" in Arg.(value & opt_all string [] & info [ "plugin" ] ~docv:"PLUGINS" ~doc) +let rifrom : (string option * string) list Term.t = + let doc = + "FROM Require Import LIBRARY before creating the document, à la From Coq \ + Require Import Prelude" + in + Term.( + const (List.map (fun (x, y) -> (Some x, y))) + $ Arg.( + value + & opt_all (pair string string) [] + & info [ "rifrom"; "require-import-from" ] ~docv:"FROM,LIBRARY" ~doc)) + let fcc_cmd : unit Cmd.t = let doc = "Flèche Coq Compiler" in let man = @@ -111,7 +124,7 @@ let fcc_cmd : unit Cmd.t = let fcc_term = Term.( const fcc_main $ roots $ display $ debug $ plugins $ file $ coqlib - $ coqcorelib $ ocamlpath $ rload_path $ load_path) + $ coqcorelib $ ocamlpath $ rload_path $ load_path $ rifrom) in Cmd.(v (Cmd.info "fcc" ~version ~doc ~man) fcc_term) diff --git a/controller/coq_lsp.ml b/controller/coq_lsp.ml index d241ae05..31ae7075 100644 --- a/controller/coq_lsp.ml +++ b/controller/coq_lsp.ml @@ -89,7 +89,8 @@ let rec lsp_init_loop ~ifn ~ofn ~cmdline ~debug = | Init_effect.Loop -> lsp_init_loop ~ifn ~ofn ~cmdline ~debug | Init_effect.Success w -> w) -let lsp_main bt coqcorelib coqlib ocamlpath vo_load_path ml_include_path delay = +let lsp_main bt coqcorelib coqlib ocamlpath vo_load_path ml_include_path + require_libraries delay = (* Try to be sane w.r.t. \r\n in Windows *) Stdlib.set_binary_mode_in stdin true; Stdlib.set_binary_mode_out stdout true; @@ -116,6 +117,7 @@ let lsp_main bt coqcorelib coqlib ocamlpath vo_load_path ml_include_path delay = ; vo_load_path ; ml_include_path ; args = [] + ; require_libraries } in @@ -231,6 +233,18 @@ let ml_include_path : string list Term.t = Arg.( value & opt_all dir [] & info [ "I"; "ml-include-path" ] ~docv:"DIR" ~doc) +let rifrom : (string option * string) list Term.t = + let doc = + "FROM Require Import LIBRARY before creating the document, à la From Coq \ + Require Import Prelude" + in + Term.( + const (List.map (fun (x, y) -> (Some x, y))) + $ Arg.( + value + & opt_all (pair string string) [] + & info [ "rifrom"; "require-import-from" ] ~docv:"FROM,LIBRARY" ~doc)) + let delay : float Term.t = let doc = "Delay value in seconds when server is idle" in Arg.(value & opt float 0.1 & info [ "D"; "idle-delay" ] ~docv:"DELAY" ~doc) @@ -253,7 +267,7 @@ let lsp_cmd : unit Cmd.t = (Cmd.info "coq-lsp" ~version:Fleche.Version.server ~doc ~man) Term.( const lsp_main $ bt $ coqcorelib $ coqlib $ ocamlpath $ vo_load_path - $ ml_include_path $ delay)) + $ ml_include_path $ rifrom $ delay)) let main () = let ecode = Cmd.eval lsp_cmd in diff --git a/coq/workspace.ml b/coq/workspace.ml index f6f7a715..9eddf563 100644 --- a/coq/workspace.ml +++ b/coq/workspace.ml @@ -80,21 +80,23 @@ let mk_userlib unix_path = let getenv var else_ = try Sys.getenv var with Not_found -> else_ -let rec parse_args args init boot f w = +let rec parse_args args init boot libs f w = match args with - | [] -> (init, boot, f, List.rev w) + | [] -> (init, boot, List.rev libs, f, List.rev w) + | "-rifrom" :: from :: lib :: rest -> + parse_args rest init boot ((Some from, lib) :: libs) f w | "-indices-matter" :: rest -> - parse_args rest init boot { f with Flags.indices_matter = true } w + parse_args rest init boot libs { f with Flags.indices_matter = true } w | "-impredicative-set" :: rest -> - parse_args rest init boot { f with Flags.impredicative_set = true } w - | "-noinit" :: rest -> parse_args rest false boot f w - | "-boot" :: rest -> parse_args rest init true f w + parse_args rest init boot libs { f with Flags.impredicative_set = true } w + | "-noinit" :: rest -> parse_args rest false boot libs f w + | "-boot" :: rest -> parse_args rest init true libs f w | "-w" :: warn :: rest -> let warn = Warning.make warn in - parse_args rest init boot f (warn :: w) + parse_args rest init boot libs f (warn :: w) | _ :: rest -> (* emit warning? *) - parse_args rest init boot f w + parse_args rest init boot libs f w module CmdLine = struct type t = @@ -104,9 +106,12 @@ module CmdLine = struct ; vo_load_path : Loadpath.vo_path list ; ml_include_path : string list ; args : string list + ; require_libraries : (string option * string) list } end +let mk_require_from (from, lib) = (lib, from, Some (Lib.Import, None)) + let make ~cmdline ~implicit ~kind ~debug = let { CmdLine.coqcorelib ; coqlib @@ -114,14 +119,15 @@ let make ~cmdline ~implicit ~kind ~debug = ; args ; ml_include_path ; vo_load_path + ; require_libraries } = cmdline in let coqcorelib = getenv "COQCORELIB" coqcorelib in let coqlib = getenv "COQLIB" coqlib in let mk_path_coqlib prefix = coqlib ^ "/" ^ prefix in - let init, boot, flags, warnings = - parse_args args true false Flags.default [] + let init, boot, libs, flags, warnings = + parse_args args true false [] Flags.default [] in (* Setup ml_include for the core plugins *) let dft_ml_include_path, dft_vo_load_path = @@ -137,7 +143,11 @@ let make ~cmdline ~implicit ~kind ~debug = stdlib_vo_path :: user_vo_path ) in let require_libs = - if init then [ ("Coq.Init.Prelude", None, Some (Lib.Import, None)) ] else [] + let rq_list = + if init then ((None, "Coq.Init.Prelude") :: require_libraries) @ libs + else require_libraries @ libs + in + List.map mk_require_from rq_list in let vo_load_path = dft_vo_load_path @ vo_load_path in let ml_include_path = dft_ml_include_path @ ml_include_path in diff --git a/coq/workspace.mli b/coq/workspace.mli index f6494856..b2fcd706 100644 --- a/coq/workspace.mli +++ b/coq/workspace.mli @@ -63,6 +63,7 @@ module CmdLine : sig ; vo_load_path : Loadpath.vo_path list ; ml_include_path : string list ; args : string list + ; require_libraries : (string option * string) list (** Library, From *) } end diff --git a/examples/lists.mv b/examples/lists.mv index 659bbc59..cabef058 100644 --- a/examples/lists.mv +++ b/examples/lists.mv @@ -1,4 +1,4 @@ -### Welcome to Coq LSP +## Welcome to Coq LSP - You can edit this document as you please - Coq will recognize the code snippets as Coq @@ -9,6 +9,11 @@ From Coq Require Import List. Import ListNotations. ``` +### Here is a simple Proof about Lists +$$ + \forall~x~l, + \mathsf{rev}(l \mathrel{++} [x]) = x \mathrel{::} (\mathsf{rev}~l) +$$ ```coq Lemma rev_snoc_cons A : forall (x : A) (l : list A), rev (l ++ [x]) = x :: rev l. @@ -19,6 +24,7 @@ Proof. Qed. ``` +### Here is another proof depending on it Try to update _above_ and **below**: ```coq Theorem rev_rev A : forall (l : list A), rev (rev l) = l. @@ -31,3 +37,12 @@ Qed. ``` Please edit your code here! + +## Here we do some lambda terms, because we can! + +```coq +Inductive term := + | Var : nat -> term + | Abs : term -> term + | Lam : term -> term -> term. +``` diff --git a/test/CoqProject/_CoqProject b/test/CoqProject/_CoqProject index da0de778..3bf09db5 100644 --- a/test/CoqProject/_CoqProject +++ b/test/CoqProject/_CoqProject @@ -3,5 +3,6 @@ -arg -w -arg -local-declaration -arg -w -arg +non-primitive-record +-arg -rifrom -arg Coq.Lists -arg List test.v diff --git a/test/CoqProject/test.v b/test/CoqProject/test.v index ea6b2bcf..e7cd74d8 100644 --- a/test/CoqProject/test.v +++ b/test/CoqProject/test.v @@ -1,3 +1,5 @@ +Search _ list. + Variable (A : nat). Set Primitive Projections. From f45ece6d86e0cde0da4b8fde95fc786c961abcc9 Mon Sep 17 00:00:00 2001 From: Emilio Jesus Gallego Arias Date: Fri, 13 Oct 2023 21:41:27 +0200 Subject: [PATCH 02/10] [client] [vscode] Export Query Goals API This way other extensions can implement their own commands that query Coq goals With #574, close #558 Co-authored-by: Ambroise Lafont --- CHANGES.md | 3 +++ README.md | 8 ++++++-- editor/code/src/client.ts | 23 +++++++++++++++++++++-- editor/code/src/goals.ts | 6 +++--- editor/code/src/node.ts | 9 +++++++-- 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 4ee537b6..f5a9a235 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -42,6 +42,9 @@ - Support for `-rifrom` in `_CoqProject` and in command line (`--rifrom`). Thanks to Lasse Blaauwbroek for the report. (@ejgallego, #581, fixes #579) + - Export Query Goals API in VSCode client; this way other extensions + can implement their own commands that query Coq goals (@amblafont, + @ejgallego, #576, closes #558) # coq-lsp 0.1.7: Just-in-time ----------------------------- diff --git a/README.md b/README.md index 5afad4d1..49538d43 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ and web native usage, providing quite a few extra features from vanilla Coq. - [📂 Working With Multiple Files](#-working-with-multiple-files) - [📔 Planned Features](#-planned-features) - [📕 Protocol Documentation](#-protocol-documentation) -- [🤸 Contributing](#-contributing) +- [🤸 Contributing and Extending the System](#-contributing-and-extending-the-system) - [🥷 Team](#-team) - [🕰️ Past Contributors](#️-past-contributors) - [©️ Licensing Information](#️-licensing-information) @@ -368,7 +368,7 @@ plus some extensions specific to Coq. Check [the `coq-lsp` protocol documentation](etc/doc/PROTOCOL.md) for more details. -## 🤸 Contributing +## 🤸 Contributing and Extending the System Contributions are very welcome! Feel free to chat with the dev team in [Zulip](https://coq.zulipchat.com/#narrow/stream/329642-coq-lsp) for any @@ -381,6 +381,10 @@ Here is a [list of project ideas](etc/ContributionIdeas.md) that could be of help in case you are looking for contribution ideas, tho we are convinced that the best ideas will arise from using `coq-lsp` in your own Coq projects. +Both Flèche and `coq-lsp` have a preliminary _plugin system_. The VSCode +extension also exports and API so other extensions use its functionality +to query and interact with Coq documents. + ## 🥷 Team - Ali Caglayan (co-coordinator) diff --git a/editor/code/src/client.ts b/editor/code/src/client.ts index 5981b61f..313e777b 100644 --- a/editor/code/src/client.ts +++ b/editor/code/src/client.ts @@ -25,9 +25,12 @@ import { FlecheDocumentParams, FlecheDocument, FlecheSaveParams, + GoalRequest, + GoalAnswer, + PpString, } from "../lib/types"; import { CoqLspClientConfig, CoqLspServerConfig } from "./config"; -import { InfoPanel } from "./goals"; +import { InfoPanel, goalReq } from "./goals"; import { FileProgressManager } from "./progress"; import { coqPerfData, PerfDataView } from "./perf"; @@ -54,10 +57,19 @@ export type ClientFactoryType = ( wsConfig: WorkspaceConfiguration ) => BaseLanguageClient; +// Extension API type (note this doesn't live in `lib` as this is VSCode specific) +export interface CoqLspAPI { + /** + * Query goals from Coq + * @param params goal request parameters + */ + goalsRequest(params: GoalRequest): Promise>; +} + export function activateCoqLSP( context: ExtensionContext, clientFactory: ClientFactoryType -): void { +): CoqLspAPI { window.showInformationMessage("Coq LSP Extension: Going to activate!"); function coqCommand(command: string, fn: () => void) { @@ -317,7 +329,14 @@ export function activateCoqLSP( createEnableButton(); start(); + + return { + goalsRequest: (params) => { + return client.sendRequest(goalReq, params); + }, + }; } + export function deactivateCoqLSP(): Thenable | undefined { if (!client) { return undefined; diff --git a/editor/code/src/goals.ts b/editor/code/src/goals.ts index 405ea840..ff7f67a8 100644 --- a/editor/code/src/goals.ts +++ b/editor/code/src/goals.ts @@ -14,7 +14,7 @@ import { } from "vscode-languageclient"; import { GoalRequest, GoalAnswer, PpString } from "../lib/types"; -const infoReq = new RequestType, void>( +export const goalReq = new RequestType, void>( "proof/goals" ); @@ -101,7 +101,7 @@ export class InfoPanel { // LSP Protocol extension for Goals sendGoalsRequest(client: BaseLanguageClient, params: GoalRequest) { this.requestSent(params); - client.sendRequest(infoReq, params).then( + client.sendRequest(goalReq, params).then( (goals) => this.requestDisplay(goals), (reason) => this.requestError(reason) ); @@ -110,7 +110,7 @@ export class InfoPanel { sendVizxRequest(client: BaseLanguageClient, params: GoalRequest) { this.requestSent(params); console.log(params.pp_format); - client.sendRequest(infoReq, params).then( + client.sendRequest(goalReq, params).then( (goals) => this.requestVizxDisplay(goals), (reason) => this.requestError(reason) ); diff --git a/editor/code/src/node.ts b/editor/code/src/node.ts index 34e3b1ad..3f2a65c2 100644 --- a/editor/code/src/node.ts +++ b/editor/code/src/node.ts @@ -1,8 +1,13 @@ import { ExtensionContext } from "vscode"; import { LanguageClient, ServerOptions } from "vscode-languageclient/node"; -import { activateCoqLSP, ClientFactoryType, deactivateCoqLSP } from "./client"; +import { + activateCoqLSP, + ClientFactoryType, + CoqLspAPI, + deactivateCoqLSP, +} from "./client"; -export function activate(context: ExtensionContext): void { +export function activate(context: ExtensionContext): CoqLspAPI { const cf: ClientFactoryType = (context, clientOptions, wsConfig) => { const serverOptions: ServerOptions = { command: wsConfig.path, From 493805d7f27488a619c3c112d23d1bf3aec604ce Mon Sep 17 00:00:00 2001 From: Emilio Jesus Gallego Arias Date: Tue, 10 Oct 2023 21:02:27 +0200 Subject: [PATCH 03/10] [goals] [fleche] Add tactic-based preprocessing to goals request. We add a new parameter `pretac` to the `GoalRequest`, that allows to query for goals but running a set of tactics (or commands) first. This is an experiment for now; in particular it'd be nice to rework the API for speculative execution prior merge. Co-authored-by: Ambroise Lafont --- CHANGES.md | 3 +++ controller/lsp_core.ml | 5 ++++- controller/rq_goals.ml | 45 +++++++++++++++++++++++++++++++++------- controller/rq_goals.mli | 4 +++- editor/code/lib/types.ts | 1 + editor/code/src/goals.ts | 2 ++ etc/doc/PROTOCOL.md | 2 ++ fleche/info.ml | 2 ++ fleche/info.mli | 5 +++-- 9 files changed, 57 insertions(+), 12 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f5a9a235..dbac0004 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -45,6 +45,9 @@ - Export Query Goals API in VSCode client; this way other extensions can implement their own commands that query Coq goals (@amblafont, @ejgallego, #576, closes #558) + - New `pretac` field for preprocessing of goals with a tactic using + speculative execution, this is experimental for now (@amblafont, + @ejgallego, #573, helps with #558) # coq-lsp 0.1.7: Just-in-time ----------------------------- diff --git a/controller/lsp_core.ml b/controller/lsp_core.ml index b1848906..3980c0ef 100644 --- a/controller/lsp_core.ml +++ b/controller/lsp_core.ml @@ -297,9 +297,12 @@ let get_pp_format params = get_pp_format_from_config () | None -> get_pp_format_from_config () +let get_pretac params = ostring_field "pretac" params + let do_goals ~params = let pp_format = get_pp_format params in - let handler = Rq_goals.goals ~pp_format in + let pretac = get_pretac params in + let handler = Rq_goals.goals ~pp_format ?pretac () in do_position_request ~postpone:true ~handler ~params let do_definition = diff --git a/controller/rq_goals.ml b/controller/rq_goals.ml index c9d9dc13..35c7027e 100644 --- a/controller/rq_goals.ml +++ b/controller/rq_goals.ml @@ -35,26 +35,55 @@ let pp ~pp_format pp = | Pp -> Lsp.JCoq.Pp.to_yojson pp | Str -> `String (Pp.string_of_ppcmds pp) -let get_goals_info ~doc ~point = +(* XXX: Speculative execution here requires more thought, about errors, + location, we need to make the request fail if it is not good, etc... Moreover + we should tune whether we cache the results; we try this for now. *) +let parse_and_execute_in tac st = + (* Parse tac, loc==FIXME *) + let str = Gramlib.Stream.of_string tac in + let str = Coq.Parsing.Parsable.make ?loc:None str in + match Coq.Parsing.parse ~st str with + | Coq.Protect.E.{ r = Interrupted; feedback = _ } + | Coq.Protect.E.{ r = Completed (Error _); feedback = _ } + | Coq.Protect.E.{ r = Completed (Ok None); feedback = _ } -> None + | Coq.Protect.E.{ r = Completed (Ok (Some ast)); feedback = _ } -> ( + let open Fleche.Memo in + (* XXX use the bind in Coq.Protect.E *) + match (Interp.eval (st, ast)).res with + | Coq.Protect.E.{ r = Interrupted; feedback = _ } + | Coq.Protect.E.{ r = Completed (Error _); feedback = _ } -> None + | Coq.Protect.E.{ r = Completed (Ok st); feedback = _ } -> Some st) + +let run_pretac ?pretac st = + match pretac with + | None -> + (* Debug option *) + (* Lsp.Io.trace "goals" "pretac empty"; *) + Some st + | Some tac -> Fleche.Info.in_state ~st ~f:(parse_and_execute_in tac) st + +let get_goal_info ~doc ~point ?pretac () = let open Fleche in let goals_mode = get_goals_mode () in let node = Info.LC.node ~doc ~point goals_mode in match node with | None -> (None, None) - | Some node -> - let st = node.Doc.Node.state in - let goals = Info.Goals.goals ~st in - let program = Info.Goals.program ~st in - (goals, Some program) + | Some node -> ( + match run_pretac ?pretac node.Doc.Node.state with + | None -> (None, None) + | Some st -> + let goals = Info.Goals.goals ~st in + let program = Info.Goals.program ~st in + (goals, Some program)) -let goals ~pp_format ~doc ~point = +let goals ~pp_format ?pretac () ~doc ~point = let open Fleche in let uri, version = (doc.Doc.uri, doc.version) in let textDocument = Lsp.Doc.VersionedTextDocumentIdentifier.{ uri; version } in let position = Lang.Point.{ line = fst point; character = snd point; offset = -1 } in - let goals, program = get_goals_info ~doc ~point in + let goals, program = get_goal_info ~doc ~point ?pretac () in let node = Info.LC.node ~doc ~point Exact in let messages = mk_messages node in let error = Option.bind node mk_error in diff --git a/controller/rq_goals.mli b/controller/rq_goals.mli index 4dec5e68..08d9670f 100644 --- a/controller/rq_goals.mli +++ b/controller/rq_goals.mli @@ -9,4 +9,6 @@ type format = | Pp | Str -val goals : pp_format:format -> Request.position +(** [goals ~pp_format ?pretac] Serve goals at point; users can request + pre-processing and formatting using the provided parameters. *) +val goals : pp_format:format -> ?pretac:string -> unit -> Request.position diff --git a/editor/code/lib/types.ts b/editor/code/lib/types.ts index 11828445..d0cf2166 100644 --- a/editor/code/lib/types.ts +++ b/editor/code/lib/types.ts @@ -69,6 +69,7 @@ export interface GoalRequest { textDocument: VersionedTextDocumentIdentifier; position: Position; pp_format?: "Pp" | "Str"; + pretac?: string; } export type Pp = diff --git a/editor/code/src/goals.ts b/editor/code/src/goals.ts index ff7f67a8..845e74fb 100644 --- a/editor/code/src/goals.ts +++ b/editor/code/src/goals.ts @@ -126,6 +126,8 @@ export class InfoPanel { uri.toString(), version ); + // let pretac = "idtac."; + // let cursor: GoalRequest = { textDocument, position, pretac }; let cursor: GoalRequest = { textDocument, position }; let strCursor: GoalRequest = { textDocument, diff --git a/etc/doc/PROTOCOL.md b/etc/doc/PROTOCOL.md index 4c54a85a..8e9d9797 100644 --- a/etc/doc/PROTOCOL.md +++ b/etc/doc/PROTOCOL.md @@ -80,6 +80,7 @@ interface GoalRequest { textDocument: VersionedTextDocumentIdentifier; position: Position; pp_format?: 'Pp' | 'Str'; + pretac?: string; } ``` @@ -162,6 +163,7 @@ was the default. #### Changelog +- v0.1.8: new optional `pretac` field for post-processing, backwards compatible with 0.1.7 - v0.1.7: program information added, rest of fields compatible with 0.1.6 - v0.1.7: pp_format field added to request, backwards compatible - v0.1.6: the `Pp` parameter can now be either Coq's `Pp.t` type or `string` (default) diff --git a/fleche/info.ml b/fleche/info.ml index 8a073511..687448d5 100644 --- a/fleche/info.ml +++ b/fleche/info.ml @@ -175,6 +175,8 @@ module Goals = struct let lemmas = Coq.State.lemmas ~st in Option.map (Coq.Goals.reify ~ppx) lemmas + (* We need to use [in_state] here due to printing not being pure, but we want + a better design here eventually *) let goals ~st = in_state ~st ~f:pr_goal st let program ~st = Coq.State.program ~st end diff --git a/fleche/info.mli b/fleche/info.mli index 6854a4bf..b0b9c781 100644 --- a/fleche/info.mli +++ b/fleche/info.mli @@ -50,10 +50,11 @@ end module LC : S with module P := LineCol module O : S with module P := Offset -(** Helper to absorb errors in state change, needed due to the lack of proper - monad in Coq.Protect, to fix soon *) +(** Helper to absorb errors in state change to [None], needed due to the lack of + proper monad in Coq.Protect, to fix soon *) val in_state : st:Coq.State.t -> f:('a -> 'b option) -> 'a -> 'b option +(** We move towards a more modular design here, for preprocessing *) module Goals : sig val goals : st:Coq.State.t -> Pp.t Coq.Goals.reified_pp option val program : st:Coq.State.t -> Declare.OblState.View.t Names.Id.Map.t From ef9c87ac854efce7271c485a7d08867aae9f9f95 Mon Sep 17 00:00:00 2001 From: Emilio Jesus Gallego Arias Date: Wed, 25 Oct 2023 16:08:25 +0200 Subject: [PATCH 04/10] [lsp] Implement `textDocument/selectionRange`. We return the range of the Coq sentence underlying the cursor. In VSCode, this is triggered by the "Expand Selection" command. Note the current implementation is partial: we only take into account the first position, and we only return a single range (Coq sentence) without parents. This could be of help for #580. --- CHANGES.md | 6 ++++++ controller/lsp_core.ml | 30 +++++++++++++++++++++++++++--- controller/request.ml | 2 ++ controller/request.mli | 2 ++ controller/rq_hover.ml | 2 +- controller/rq_init.ml | 1 + controller/rq_selectionRange.ml | 26 ++++++++++++++++++++++++++ controller/rq_selectionRange.mli | 18 ++++++++++++++++++ etc/doc/PROTOCOL.md | 1 + lsp/core.ml | 9 +++++++++ lsp/core.mli | 9 +++++++++ 11 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 controller/rq_selectionRange.ml create mode 100644 controller/rq_selectionRange.mli diff --git a/CHANGES.md b/CHANGES.md index dbac0004..895093d4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -48,6 +48,12 @@ - New `pretac` field for preprocessing of goals with a tactic using speculative execution, this is experimental for now (@amblafont, @ejgallego, #573, helps with #558) + - Implement `textDocument/selectionRange` request, that will return + the range of the Coq sentence underlying the cursor. In VSCode, + this is triggered by the "Expand Selection" command. The + implementation is partial: we only take into account the first + position, and we only return a single range (Coq sentence) without + parents. (@ejgallego, #582) # coq-lsp 0.1.7: Just-in-time ----------------------------- diff --git a/controller/lsp_core.ml b/controller/lsp_core.ml index 3980c0ef..6770bd04 100644 --- a/controller/lsp_core.ml +++ b/controller/lsp_core.ml @@ -25,7 +25,6 @@ module U = Yojson.Safe.Util let field name dict = List.(assoc name dict) let int_field name dict = U.to_int (field name dict) -let dict_field name dict = U.to_assoc (field name dict) let list_field name dict = U.to_list (field name dict) let string_field name dict = U.to_string (field name dict) let ofield name dict = List.(assoc_opt name dict) @@ -70,10 +69,18 @@ module Helpers = struct let Lsp.Doc.VersionedTextDocumentIdentifier.{ uri; version } = document in (uri, version) - let get_position params = - let pos = dict_field "position" params in + let lsp_position_to_tuple (pos : J.t) = + let pos = U.to_assoc pos in let line, character = (int_field "line" pos, int_field "character" pos) in (line, character) + + let get_position params = + let pos = field "position" params in + lsp_position_to_tuple pos + + let get_position_array params = + let pos_list = list_field "positions" params in + List.map lsp_position_to_tuple pos_list end (** LSP loop internal state: mainly the data needed to create a new document. In @@ -276,8 +283,24 @@ let do_position_request ~postpone ~params ~handler = Rq.Action.Data (Request.Data.PosRequest { uri; handler; point; version; postpone }) +(* For now we only pick the first item *) +let do_position_list_request ~postpone ~params ~handler = + let uri, version = Helpers.get_uri_oversion params in + let points = Helpers.get_position_array params in + match points with + | [] -> + let point, handler = ((0, 0), Request.empty) in + Rq.Action.Data + (Request.Data.PosRequest { uri; handler; point; version; postpone }) + | point :: _ -> + Rq.Action.Data + (Request.Data.PosRequest { uri; handler; point; version; postpone }) + let do_hover = do_position_request ~postpone:false ~handler:Rq_hover.hover +let do_selectionRange = + do_position_list_request ~postpone:false ~handler:Rq_selectionRange.request + (* We get the format from the params *) let get_pp_format_from_config () = match !Fleche.Config.v.pp_type with @@ -423,6 +446,7 @@ let dispatch_request ~method_ ~params : Rq.Action.t = | "textDocument/documentSymbol" -> do_symbols ~params | "textDocument/hover" -> do_hover ~params | "textDocument/codeLens" -> do_lens ~params + | "textDocument/selectionRange" -> do_selectionRange ~params (* Proof-specific stuff *) | "proof/goals" -> do_goals ~params (* Proof-specific stuff *) diff --git a/controller/request.ml b/controller/request.ml index 70c324ab..e6da1057 100644 --- a/controller/request.ml +++ b/controller/request.ml @@ -58,3 +58,5 @@ module Data = struct | PosRequest { uri = _; point; version = _; postpone = _; handler } -> handler ~point ~doc end + +let empty ~doc:_ ~point:_ = Ok (`List []) diff --git a/controller/request.mli b/controller/request.mli index d97c5a89..312cbfc6 100644 --- a/controller/request.mli +++ b/controller/request.mli @@ -42,3 +42,5 @@ module Data : sig val dm_request : t -> Fleche.Theory.Request.request val serve : doc:Fleche.Doc.t -> t -> R.t end + +val empty : position diff --git a/controller/rq_hover.ml b/controller/rq_hover.ml index a441d260..6d600f91 100644 --- a/controller/rq_hover.ml +++ b/controller/rq_hover.ml @@ -173,7 +173,7 @@ module type HoverProvider = sig end module Loc_info : HoverProvider = struct - let enabled = false + let enabled = true let h ~contents:_ ~point:_ ~node = match node with diff --git a/controller/rq_init.ml b/controller/rq_init.ml index eff20ec3..29a7adaf 100644 --- a/controller/rq_init.ml +++ b/controller/rq_init.ml @@ -128,6 +128,7 @@ let do_initialize ~params = ] ) ; ("definitionProvider", `Bool true) ; ("codeLensProvider", `Assoc []) + ; ("selectionRangeProvider", `Bool true) ; ( "workspace" , `Assoc [ ( "workspaceFolders" diff --git a/controller/rq_selectionRange.ml b/controller/rq_selectionRange.ml new file mode 100644 index 00000000..96016d4e --- /dev/null +++ b/controller/rq_selectionRange.ml @@ -0,0 +1,26 @@ +(************************************************************************) +(* * The Coq Proof Assistant / The Coq Development Team *) +(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *) +(* Ok `Null + | Some node -> + let range = Fleche.Doc.Node.range node in + let parent = None in + let answer = Lsp.Core.SelectionRange.({ range; parent } |> to_yojson) in + Ok (`List [ answer ]) diff --git a/controller/rq_selectionRange.mli b/controller/rq_selectionRange.mli new file mode 100644 index 00000000..45983b03 --- /dev/null +++ b/controller/rq_selectionRange.mli @@ -0,0 +1,18 @@ +(************************************************************************) +(* * The Coq Proof Assistant / The Coq Development Team *) +(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *) +(* Date: Wed, 25 Oct 2023 17:05:38 +0200 Subject: [PATCH 05/10] [meta] Bump version to 0.1.8 We should not forget to bump to `0.1.9-dev` after release. --- CHANGES.md | 4 ++-- editor/code/package.json | 2 +- fleche/version.ml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index dbac0004..be8d24a7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,5 @@ -# coq-lsp 0.1.8: Dot / Bracket ------------------------------- +# coq-lsp 0.1.8: Trick-or-treat +------------------------------- - Update VSCode client dependencies, should bring some performance improvements to goal pretty printing (@ejgallego, #530) diff --git a/editor/code/package.json b/editor/code/package.json index e88553a3..6a528f2a 100644 --- a/editor/code/package.json +++ b/editor/code/package.json @@ -2,7 +2,7 @@ "name": "coq-lsp", "displayName": "Coq LSP", "description": "Coq LSP provides native vsCode support for checking Coq proof documents", - "version": "0.1.7", + "version": "0.1.8", "contributors": [ "Emilio Jesús Gallego Arias ", "Ali Caglayan ", diff --git a/fleche/version.ml b/fleche/version.ml index f5e42014..2d0a208b 100644 --- a/fleche/version.ml +++ b/fleche/version.ml @@ -12,6 +12,6 @@ type t = string (************************************************************************) (* UPDATE VERSION HERE *) -let server = "0.1.7" +let server = "0.1.8" (* UPDATE VERSION HERE *) (************************************************************************) From 305377c37207d48bb4357fdd46aea32dc809a5a8 Mon Sep 17 00:00:00 2001 From: Emilio Jesus Gallego Arias Date: Wed, 25 Oct 2023 16:59:50 +0200 Subject: [PATCH 06/10] [workspace] [windows] Tolerate better Windows paths with mixed path separators. This needs a more principled approach, but should fix the most immediate Windows problems. Fixes #569 --- CHANGES.md | 2 ++ controller/lsp_core.ml | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 895093d4..bf600b79 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -54,6 +54,8 @@ implementation is partial: we only take into account the first position, and we only return a single range (Coq sentence) without parents. (@ejgallego, #582) + - Be more robust to mixed-separator windows paths in workspace + detection (@ejgallego, #583, fixes #569) # coq-lsp 0.1.7: Just-in-time ----------------------------- diff --git a/controller/lsp_core.ml b/controller/lsp_core.ml index 6770bd04..0b9f1d30 100644 --- a/controller/lsp_core.ml +++ b/controller/lsp_core.ml @@ -115,7 +115,17 @@ module State = struct let dir = Lang.LUri.File.to_string_file uri in { state with workspaces = List.remove_assoc dir state.workspaces } - let is_in_dir ~dir ~file = CString.is_prefix dir file + let split_in_components path = + let phase1 = String.split_on_char '/' path in + let phase2 = List.map (String.split_on_char '\\') phase1 in + List.concat phase2 + + (* This is a bit more tricky in Windows, due to \ vs / paths appearing, so we + need to first split the dir *) + let is_in_dir ~dir ~file = + let dir_c = split_in_components dir in + let file_c = split_in_components file in + CList.prefix_of String.equal dir_c file_c let workspace_of_uri ~uri ~state = let { root_state; workspaces; _ } = state in From 59c921ee308f69be72dcd2478fa16cc31b96c29c Mon Sep 17 00:00:00 2001 From: Emilio Jesus Gallego Arias Date: Wed, 25 Oct 2023 17:42:06 +0200 Subject: [PATCH 07/10] [info view] Adjust breaks in errors and messages panels. Fixes #457 , fixes #458 , fixes #571 This is a hotfix, but we should actually move this logic to the CoqPp component, as adjusting the breaks at every use doesn't scale. However this fix should be good for now, as the above fix requires a bit more thinking about the structure of the HTML that contains `Pp` --- CHANGES.md | 2 ++ editor/code/views/info/ErrorBrowser.tsx | 14 +++++++++++++- editor/code/views/info/Message.tsx | 12 +++++++++++- editor/code/views/info/media/goals.css | 10 ++++++++++ examples/record_print.v | 24 ++++++++++++++++++++++++ 5 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 examples/record_print.v diff --git a/CHANGES.md b/CHANGES.md index 1ab98686..ebc66cd5 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -56,6 +56,8 @@ parents. (@ejgallego, #582) - Be more robust to mixed-separator windows paths in workspace detection (@ejgallego, #583, fixes #569) + - Adjust printing breaks in error and message panels (@ejgallego, + @Alizter, #586, fixes #457 , fixes #458 , fixes #571) # coq-lsp 0.1.7: Just-in-time ----------------------------- diff --git a/editor/code/views/info/ErrorBrowser.tsx b/editor/code/views/info/ErrorBrowser.tsx index 964968fa..cb533baf 100644 --- a/editor/code/views/info/ErrorBrowser.tsx +++ b/editor/code/views/info/ErrorBrowser.tsx @@ -1,13 +1,25 @@ import { PpString } from "../../lib/types"; import { CoqPp } from "./CoqPp"; +import { FormatPrettyPrint } from "../../lib/format-pprint/js/main"; +import $ from "jquery"; +import { useLayoutEffect, useRef } from "react"; export type ErrorBrowserParams = { error: PpString }; export function ErrorBrowser({ error }: ErrorBrowserParams) { + const ref: React.LegacyRef | null = useRef(null); + useLayoutEffect(() => { + if (ref.current) { + FormatPrettyPrint.adjustBreaks($(ref.current)); + } + }); + return ( <>
Errors:
- ; +
+ ; +
); } diff --git a/editor/code/views/info/Message.tsx b/editor/code/views/info/Message.tsx index 3218ec86..1b3e2334 100644 --- a/editor/code/views/info/Message.tsx +++ b/editor/code/views/info/Message.tsx @@ -1,7 +1,10 @@ // import objectHash from "object-hash"; +import { useLayoutEffect, useRef } from "react"; import { Message } from "../../lib/types"; import { PpString } from "../../lib/types"; import { CoqPp } from "./CoqPp"; +import { FormatPrettyPrint } from "../../lib/format-pprint/js/main"; +import $ from "jquery"; export function Message({ key, @@ -10,6 +13,13 @@ export function Message({ key: React.Key; message: PpString | Message; }) { + const ref: React.LegacyRef | null = useRef(null); + useLayoutEffect(() => { + if (ref.current) { + FormatPrettyPrint.adjustBreaks($(ref.current)); + } + }); + let text = typeof message === "string" ? message @@ -18,7 +28,7 @@ export function Message({ : message; return ( -
  • +
  • ); diff --git a/editor/code/views/info/media/goals.css b/editor/code/views/info/media/goals.css index 15838b7a..6c520206 100644 --- a/editor/code/views/info/media/goals.css +++ b/editor/code/views/info/media/goals.css @@ -53,8 +53,18 @@ p.num-goals + p.aside { margin-bottom: 1em; } +/* XXX: We need to handle the white-space: pre that all Pp stuff needs + better */ .coq-goal-env { padding-top: 1ex; padding-bottom: 1ex; white-space: pre; } + +.coq-message { + white-space: pre; +} + +.coq-error { + white-space: pre; +} diff --git a/examples/record_print.v b/examples/record_print.v new file mode 100644 index 00000000..c0105b07 --- /dev/null +++ b/examples/record_print.v @@ -0,0 +1,24 @@ +Record t : Type := { + carrier :> Type; + unit : carrier; + mult : carrier -> carrier -> carrier; + assoc : forall a b c, mult a (mult b c) = mult (mult a b) c; + unit_l : forall a, mult unit a = a; + unit_r : forall a, mult a unit = a; +}. + +Print t. + +Module A. +Axiom A : Type. +Axiom B : Type. +Axiom C : Type. +Axiom D : Type. +Axiom E : Type. +End A. + +Print A. + +Goal True /\ True /\ True /\ True /\ True /\ True /\ True /\ True /\ True /\ True /\ True. +apply I. +Qed. From 550a4a48d22d00c6173a1d991b4dc45e1fcf929f Mon Sep 17 00:00:00 2001 From: Emilio Jesus Gallego Arias Date: Wed, 25 Oct 2023 17:59:43 +0200 Subject: [PATCH 08/10] [code] Update client changelog. --- editor/code/CHANGELOG.md | 61 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/editor/code/CHANGELOG.md b/editor/code/CHANGELOG.md index a199fe16..b5eee4a5 100644 --- a/editor/code/CHANGELOG.md +++ b/editor/code/CHANGELOG.md @@ -1,3 +1,64 @@ +# coq-lsp 0.1.8: Trick-or-treat +------------------------------- + + - Update VSCode client dependencies, should bring some performance + improvements to goal pretty printing (@ejgallego, #530) + - Update goal display colors for light mode so they are actually + readable now. (@bhaktishh, #539, fixes #532) + - Added link to Python coq-lsp client by Pedro Carrot and Nuno + Saavedra (@Nfsaavedra, #536) + - Properly concatenate warnings from _CoqProject (@ejgallego, + reported by @mituharu, #541, fixes #540) + - Fix broken `coq/saveVo` and `coq/getDocument` requests due to a + parsing problem with extra fields in their requests (@ejgallego, + #547, reported by @Zimmi48) + - `fcc` now understands the `--coqlib`, `--coqcorelib`, + `--ocamlpath`, `-Q` and `-R` arguments (@ejgallego, #555) + - Describe findlib status in `Workspace.describe`, which is printed + in the output windows (@ejgallego, #556) + - `coq-lsp` plugin loader will now be strict in case of a plugin + failure, the previous loose behavior was more convenient for the + early releases, but it doesn't make sense now and made things + pretty hard to debug on the Windows installer (@ejgallego, #557) + - Add pointers to Windows installers (@ejgallego, #559) + - Recognize `Goal` and `Definition $id : ... .` as proof starters + (@ejgallego, #561, reported by @Zimmi48, fixes #548) + - Provide basic notation information on hover. This is intended for + people to build their own more refined notation feedback systems + (@ejgallego, #562) + - Hover request can now be extended by plugins (@ejgallego, #562) + - Updated LSP and JS client libs, notably to vscode-languageclient 9 + (@ejgallego, #565) + - Implement a LIFO document scheduler, this is heavier in the + background as more documents will be checked, but provides a few + usability improvements (@ejgallego, #566, fixes #563, reported by + Ali Caglayan) + - New lexical qed detection error recovery rule; this makes a very + large usability difference in practice when editing inside proofs. + (@ejgallego, #567, fixes #33) + - `coq-lsp` is now supported by the `coq-nix-toolbox` (@Zimmi48, + @CohenCyril, #572, via + https://github.com/coq-community/coq-nix-toolbox/pull/164 ) + - Support for `-rifrom` in `_CoqProject` and in command line + (`--rifrom`). Thanks to Lasse Blaauwbroek for the report. + (@ejgallego, #581, fixes #579) + - Export Query Goals API in VSCode client; this way other extensions + can implement their own commands that query Coq goals (@amblafont, + @ejgallego, #576, closes #558) + - New `pretac` field for preprocessing of goals with a tactic using + speculative execution, this is experimental for now (@amblafont, + @ejgallego, #573, helps with #558) + - Implement `textDocument/selectionRange` request, that will return + the range of the Coq sentence underlying the cursor. In VSCode, + this is triggered by the "Expand Selection" command. The + implementation is partial: we only take into account the first + position, and we only return a single range (Coq sentence) without + parents. (@ejgallego, #582) + - Be more robust to mixed-separator windows paths in workspace + detection (@ejgallego, #583, fixes #569) + - Adjust printing breaks in error and message panels (@ejgallego, + @Alizter, #586, fixes #457 , fixes #458 , fixes #571) + # coq-lsp 0.1.7: Just-in-time ----------------------------- From 02452fb993bf9c0b83901e72ed78ff5c4fc53c88 Mon Sep 17 00:00:00 2001 From: Emilio Jesus Gallego Arias Date: Wed, 25 Oct 2023 18:05:25 +0200 Subject: [PATCH 09/10] [code] Add vsce to dev deps, refresh package.json file. --- editor/code/package-lock.json | 1376 ++++++++++++++++++++++++++++++++- editor/code/package.json | 3 +- 2 files changed, 1340 insertions(+), 39 deletions(-) diff --git a/editor/code/package-lock.json b/editor/code/package-lock.json index 75a49c8d..d7c254a9 100644 --- a/editor/code/package-lock.json +++ b/editor/code/package-lock.json @@ -1,12 +1,12 @@ { "name": "coq-lsp", - "version": "0.1.7", + "version": "0.1.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coq-lsp", - "version": "0.1.7", + "version": "0.1.8", "dependencies": { "@vscode/webview-ui-toolkit": "^1.2.2", "jquery": "^3.7.1", @@ -26,6 +26,7 @@ "@types/throttle-debounce": "^5.0.0", "@types/vscode": "^1.75.0", "@types/vscode-webview": "^1.57.2", + "@vscode/vsce": "^2.21.1", "esbuild": "^0.16.17", "prettier": "^3.0.3", "typescript": "^5.2.2" @@ -392,9 +393,9 @@ "integrity": "sha512-gQutuDHPKNxUEcQ4pypZT4Wmrbapus+P9s3bR/SEOLsMbNqNoXigGImITygI5zhb+aA5rzflM6O8YWkmRbGkPA==" }, "node_modules/@microsoft/fast-foundation": { - "version": "2.49.1", - "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.49.1.tgz", - "integrity": "sha512-dSajlZeX+lkqjg4108XbIIhVLECgJTCG32bE8P6rNgo8XCPHVJBDiBejrF34lv5pO9Z2uGORZjeip/N0fPib+g==", + "version": "2.49.2", + "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.49.2.tgz", + "integrity": "sha512-xA7WP/Td33SW0zkpHRH5LUDxyLOPnPQQXieRxc080uLWxoGXhVxo6Rz7b6qwiL+e2IadNCm7X7KcrgsUhJwvBg==", "dependencies": { "@microsoft/fast-element": "^1.12.0", "@microsoft/fast-web-utilities": "^5.4.1", @@ -423,36 +424,36 @@ } }, "node_modules/@types/jquery": { - "version": "3.5.20", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.20.tgz", - "integrity": "sha512-UI+EGhgYD4LdSZ8gaiziFqXYIIB38VQSDsnAs8jL/div7FGrzrShx4HKCykVzk3tPfiIlusdNP9Wi3G60LCF2Q==", + "version": "3.5.25", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.25.tgz", + "integrity": "sha512-gykx2c+OZf5nx2tv/5fDQqmvGgTiXshELy5jf9IgXPtVfSBl57IUYByN4osbwMXwJijWGOEYQABzGaFZE79A0Q==", "dev": true, "dependencies": { "@types/sizzle": "*" } }, "node_modules/@types/node": { - "version": "18.18.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.1.tgz", - "integrity": "sha512-3G42sxmm0fF2+Vtb9TJQpnjmP+uKlWvFa8KoEGquh4gqRmoUG/N0ufuhikw6HEsdG2G2oIKhog1GCTfz9v5NdQ==", + "version": "18.18.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.6.tgz", + "integrity": "sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==", "dev": true }, "node_modules/@types/object-hash": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-3.0.4.tgz", - "integrity": "sha512-w4fEy2suq1bepUxHoJRCBHJz0vS5DPAYpSbcgNwOahljxwyJsiKmi8qyes2/TJc+4Avd7fsgP+ZgUuXZjPvdug==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-3.0.5.tgz", + "integrity": "sha512-WFGeSazfL5BWbEh5ACaAIs5RT6sbVIwBs1rgHUp+kZzX/gub41LEEYWTWbYnE/sKb7hDdPEsGa1Vmcaay2fS5g==", "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==", + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==", "dev": true }, "node_modules/@types/react": { - "version": "18.2.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.24.tgz", - "integrity": "sha512-Ee0Jt4sbJxMu1iDcetZEIKQr99J1Zfb6D4F3qfUWoR1JpInkY1Wdg4WwCyBjL257D0+jGqSl1twBjV8iCaC0Aw==", + "version": "18.2.32", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.32.tgz", + "integrity": "sha512-F0FVIZQ1x5Gxy/VYJb7XcWvCcHR28Sjwt1dXLspdIatfPq1MVACfnBDwKe6ANLxQ64riIJooXClpUR6oxTiepg==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -461,44 +462,103 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.8", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.8.tgz", - "integrity": "sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==", + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", + "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==", + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==", "dev": true }, "node_modules/@types/sizzle": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.4.tgz", - "integrity": "sha512-jA2llq2zNkg8HrALI7DtWzhALcVH0l7i89yhY3iBdOz6cBPeACoFq+fkQrjHA39t1hnSFOboZ7A/AY5MMZSlag==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.5.tgz", + "integrity": "sha512-tAe4Q+OLFOA/AMD+0lq8ovp8t3ysxAOeaScnfNdZpUxaGl51ZMDEITxkvFl1STudQ58mz6gzVGl9VhMKhwRnZQ==", "dev": true }, "node_modules/@types/throttle-debounce": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-5.0.0.tgz", - "integrity": "sha512-Pb7k35iCGFcGPECoNE4DYp3Oyf2xcTd3FbFQxXUI9hEYKUl6YX+KLf7HrBmgVcD05nl50LIH6i+80js4iYmWbw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-5.0.1.tgz", + "integrity": "sha512-/fifasjlhpz/r4YsH0r0ZXJvivXFB3F6bmezMnqgsn/NK/fYJn7vN84k7eYn/oALu/aenXo+t8Pv+QlkS6iYBg==", "dev": true }, "node_modules/@types/vscode": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.82.0.tgz", - "integrity": "sha512-VSHV+VnpF8DEm8LNrn8OJ8VuUNcBzN3tMvKrNpbhhfuVjFm82+6v44AbDhLvVFgCzn6vs94EJNTp7w8S6+Q1Rw==", + "version": "1.83.1", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.83.1.tgz", + "integrity": "sha512-BHu51NaNKOtDf3BOonY3sKFFmZKEpRkzqkZVpSYxowLbs5JqjOQemYFob7Gs5rpxE5tiGhfpnMpcdF/oKrLg4w==", "dev": true }, "node_modules/@types/vscode-webview": { - "version": "1.57.2", - "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.2.tgz", - "integrity": "sha512-RpkIso3+FVoi9hFwHj9uBFO+9p8PGym0LnLJ9Yabo9mUJaV39CzOxz6EVtHg8AidA9hAf4cVmG0c+l9pvw6Lbw==", + "version": "1.57.3", + "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.3.tgz", + "integrity": "sha512-8at2UVGjA/6gcLOay+J8wOars6VsDqAqPxRHYihH0XFUaXt+2AZ+Hd9hSoUbnhjicb6V1xe7rfjb7j4Ri2n1fg==", "dev": true }, + "node_modules/@vscode/vsce": { + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.21.1.tgz", + "integrity": "sha512-f45/aT+HTubfCU2oC7IaWnH9NjOWp668ML002QiFObFRVUCoLtcwepp9mmql/ArFUy+HCHp54Xrq4koTcOD6TA==", + "dev": true, + "dependencies": { + "azure-devops-node-api": "^11.0.1", + "chalk": "^2.4.2", + "cheerio": "^1.0.0-rc.9", + "commander": "^6.2.1", + "glob": "^7.0.6", + "hosted-git-info": "^4.0.2", + "jsonc-parser": "^3.2.0", + "leven": "^3.1.0", + "markdown-it": "^12.3.2", + "mime": "^1.3.4", + "minimatch": "^3.0.3", + "parse-semver": "^1.1.1", + "read": "^1.0.7", + "semver": "^7.5.2", + "tmp": "^0.2.1", + "typed-rest-client": "^1.8.4", + "url-join": "^4.0.1", + "xml2js": "^0.5.0", + "yauzl": "^2.3.1", + "yazl": "^2.2.2" + }, + "bin": { + "vsce": "vsce" + }, + "engines": { + "node": ">= 14" + }, + "optionalDependencies": { + "keytar": "^7.7.0" + } + }, + "node_modules/@vscode/vsce/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@vscode/vsce/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@vscode/webview-ui-toolkit": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.2.2.tgz", @@ -512,11 +572,78 @@ "react": ">=16.9.0" } }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/azure-devops-node-api": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz", + "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==", + "dev": true, + "dependencies": { + "tunnel": "0.0.6", + "typed-rest-client": "^1.8.4" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "optional": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -525,12 +652,304 @@ "balanced-match": "^1.0.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "optional": true + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "dev": true }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "optional": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/esbuild": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", @@ -568,11 +987,269 @@ "@esbuild/win32-x64": "0.16.17" } }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/exenv-es6": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/exenv-es6/-/exenv-es6-1.1.1.tgz", "integrity": "sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==" }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "optional": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, + "optional": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "optional": true + }, "node_modules/jquery": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", @@ -583,6 +1260,42 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -605,6 +1318,62 @@ "node": ">=10" } }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -616,6 +1385,68 @@ "node": ">=10" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "optional": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "optional": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true, + "optional": true + }, + "node_modules/node-abi": { + "version": "3.51.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.51.0.tgz", + "integrity": "sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==", + "dev": true, + "optional": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "dev": true, + "optional": true + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", @@ -624,6 +1455,109 @@ "node": ">= 6" } }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parse-semver": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", + "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==", + "dev": true, + "dependencies": { + "semver": "^5.1.0" + } + }, + "node_modules/parse-semver/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "optional": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prettier": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", @@ -639,6 +1573,48 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "optional": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -662,6 +1638,75 @@ "react": "^18.2.0" } }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "dependencies": { + "mute-stream": "~0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -684,11 +1729,149 @@ "node": ">=10" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/tabbable": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==" }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "optional": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "optional": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/throttle-debounce": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", @@ -697,11 +1880,56 @@ "node": ">=12.22" } }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "dev": true, + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typed-rest-client": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", + "dev": true, + "dependencies": { + "qs": "^6.9.1", + "tunnel": "0.0.6", + "underscore": "^1.12.1" + } + }, "node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -715,6 +1943,31 @@ "node": ">=14.17" } }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", + "dev": true + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "optional": true + }, "node_modules/vscode-jsonrpc": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", @@ -750,10 +2003,57 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yazl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3" + } } } } diff --git a/editor/code/package.json b/editor/code/package.json index 6a528f2a..f66fddc1 100644 --- a/editor/code/package.json +++ b/editor/code/package.json @@ -287,7 +287,8 @@ "@types/vscode-webview": "^1.57.2", "esbuild": "^0.16.17", "prettier": "^3.0.3", - "typescript": "^5.2.2" + "typescript": "^5.2.2", + "@vscode/vsce": "^2.21.1" }, "dependencies": { "@vscode/webview-ui-toolkit": "^1.2.2", From e3a83afc1a6fc665ba7a2eecf35b25a85cfea224 Mon Sep 17 00:00:00 2001 From: Emilio Jesus Gallego Arias Date: Wed, 25 Oct 2023 18:08:03 +0200 Subject: [PATCH 10/10] [contributing] Nit on release process. --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d9cebde8..f79b11ac 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -314,9 +314,10 @@ The checklist for the release as of today is the following: The above can be done with: ``` -export COQLSPV=0.1.7 +export COQLSPV=0.1.8 git checkout main && make && dune-release tag ${COQLSPV} -git checkout v8.17 && git merge main && make && dune-release tag ${COQLSPV}+8.17 && dune-release +git checkout v8.18 && git merge main && make && dune-release tag ${COQLSPV}+8.18 && dune-release +git checkout v8.17 && git merge v8.18 && make && dune-release tag ${COQLSPV}+8.17 && dune-release git checkout v8.16 && git merge v8.17 && make && dune-release tag ${COQLSPV}+8.16 && dune-release ```