this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add opam file

Ulysse Gérard edb1172d

+1713
+40
.github/workflows/emacs-lint.yml
··· 1 + name: Emacs lint 2 + 3 + on: 4 + push: 5 + paths: 6 + - 'emacs/**' 7 + pull_request: 8 + paths: 9 + - 'emacs/**' 10 + 11 + jobs: 12 + build: 13 + runs-on: ubuntu-latest 14 + strategy: 15 + matrix: 16 + emacs_version: 17 + #- 25.1 18 + #- 25.2 19 + #- 25.3 20 + #- 26.1 21 + #- 26.2 22 + #- 26.3 23 + #- 27.1 24 + - 27.2 25 + - snapshot 26 + # include: 27 + # - emacs_version: 24.1 28 + # lint_ignore: 1 29 + # - emacs_version: 24.2 30 + # lint_ignore: 1 31 + env: 32 + EMACS_LINT_IGNORE: ${{ matrix.lint_ignore }} 33 + steps: 34 + - uses: purcell/setup-emacs@master 35 + with: 36 + version: ${{ matrix.emacs_version }} 37 + 38 + - uses: actions/checkout@v2 39 + - name: Run tests 40 + run: 'cd emacs && ./check.sh'
+70
.github/workflows/js.yml
··· 1 + # This is a basic workflow to help you get started with Actions 2 + 3 + name: CI 4 + 5 + # Controls when the action will run. Triggers the workflow on push or pull request 6 + # events but only for the master branch 7 + on: 8 + push: 9 + branches: [ jsjsjs ] 10 + paths-ignore: 11 + - '**.md' 12 + - '**.txt' 13 + - '.git*' 14 + - 'doc/**' 15 + - 'emacs/**' 16 + - 'vim/**' 17 + pull_request: 18 + branches: [ jsjsjs ] 19 + paths-ignore: 20 + - '**.md' 21 + - '**.txt' 22 + - '.git*' 23 + - 'doc/**' 24 + - 'emacs/**' 25 + - 'vim/**' 26 + schedule: 27 + - cron: '0 12 */6 * *' 28 + 29 + # A workflow run is made up of one or more jobs that can run sequentially or in parallel 30 + jobs: 31 + # This workflow contains a single job called "build" 32 + build: 33 + strategy: 34 + fail-fast: false 35 + matrix: 36 + os: 37 + - ubuntu-latest 38 + ocaml-compiler: 39 + - 4.13.x 40 + # The type of runner that the job will run on 41 + runs-on: ${{ matrix.os }} 42 + 43 + # Steps represent a sequence of tasks that will be executed as part of the job 44 + steps: 45 + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 46 + - uses: actions/checkout@v3 47 + 48 + - name: Set up OCaml ${{ matrix.ocaml-compiler }} 49 + uses: ocaml/setup-ocaml@v2 50 + if: runner.os != 'Windows' 51 + with: 52 + # Version of the OCaml compiler to initialise 53 + ocaml-compiler: ${{ matrix.ocaml-compiler }} 54 + opam-repositories: | 55 + default: https://github.com/ocaml/opam-repository.git 56 + beta: https://github.com/ocaml/ocaml-beta-repository.git 57 + 58 + - name: Install dependencies 59 + run: | 60 + opam depext conf-jq --yes # opam depext bug 61 + opam pin menhirLib 20201216 62 + opam install . --deps-only --with-test 63 + 64 + - name: Build and test in release mode 65 + run: opam exec -- make js 66 + - name: Deploy 67 + uses: peaceiris/actions-gh-pages@v3 68 + with: 69 + github_token: ${{ secrets.GITHUB_TOKEN }} 70 + publish_dir: ./merlinjs
+83
.github/workflows/main.yml
··· 1 + # This is a basic workflow to help you get started with Actions 2 + 3 + name: CI 4 + 5 + # Controls when the action will run. Triggers the workflow on push or pull request 6 + # events but only for the master branch 7 + on: 8 + push: 9 + branches: [ master ] 10 + paths-ignore: 11 + - '**.md' 12 + - '**.txt' 13 + - '.git*' 14 + - 'doc/**' 15 + - 'emacs/**' 16 + - 'vim/**' 17 + pull_request: 18 + branches: [ master ] 19 + paths-ignore: 20 + - '**.md' 21 + - '**.txt' 22 + - '.git*' 23 + - 'doc/**' 24 + - 'emacs/**' 25 + - 'vim/**' 26 + schedule: 27 + - cron: '0 12 */6 * *' 28 + 29 + # A workflow run is made up of one or more jobs that can run sequentially or in parallel 30 + jobs: 31 + # This workflow contains a single job called "build" 32 + build: 33 + strategy: 34 + fail-fast: false 35 + matrix: 36 + os: 37 + - macos-latest 38 + - ubuntu-latest 39 + - windows-latest 40 + ocaml-compiler: 41 + - 4.13.x 42 + # The type of runner that the job will run on 43 + runs-on: ${{ matrix.os }} 44 + 45 + # Steps represent a sequence of tasks that will be executed as part of the job 46 + steps: 47 + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 48 + - uses: actions/checkout@v3 49 + 50 + - name: Set up OCaml ${{ matrix.ocaml-compiler }} 51 + uses: ocaml/setup-ocaml@v2 52 + if: runner.os != 'Windows' 53 + with: 54 + # Version of the OCaml compiler to initialise 55 + ocaml-compiler: ${{ matrix.ocaml-compiler }} 56 + opam-repositories: | 57 + default: https://github.com/ocaml/opam-repository.git 58 + beta: https://github.com/ocaml/ocaml-beta-repository.git 59 + 60 + - name: Set up OCaml ${{ matrix.ocaml-compiler }} 61 + uses: ocaml/setup-ocaml@v2 62 + if: runner.os == 'Windows' 63 + with: 64 + # Version of the OCaml compiler to initialise 65 + ocaml-compiler: ${{ matrix.ocaml-compiler }} 66 + opam-repositories: | 67 + default: https://github.com/fdopen/opam-repository-mingw.git#opam2 68 + beta: https://github.com/ocaml/ocaml-beta-repository.git 69 + 70 + - name: Install dependencies 71 + run: | 72 + opam depext conf-jq --yes # opam depext bug 73 + opam pin menhirLib 20201216 74 + opam install . --deps-only --with-test 75 + 76 + - name: Build and test in release mode 77 + run: opam exec -- dune runtest -p merlin,dot-merlin-reader 78 + 79 + - name: Build in dev mode to check parser changes 80 + if: matrix.os == 'ubuntu-latest' 81 + run: | 82 + opam exec -- dune build 83 + git diff --exit-code
+25
.gitignore
··· 1 + _build 2 + _opam 3 + .merlin 4 + jbuild-workspace 5 + dune-workspace 6 + *.install 7 + *.tar.gz 8 + *.pyc 9 + *.cmly 10 + *.elc 11 + 12 + /ocamlmerlin 13 + /ocamlmerlin-server 14 + /ocamlmerlin-lsp 15 + /dot-merlin-reader 16 + 17 + # Ignore garbage files from editors 18 + *.un~ 19 + *.swp 20 + *.swo 21 + 22 + # merlin js specific 23 + *.bc* 24 + node_modules 25 + index.js
+30
Makefile
··· 1 + all: build ocamlmerlin ocamlmerlin-server dot-merlin-reader 2 + 3 + build: 4 + dune build --always-show-command-line 5 + 6 + ocamlmerlin ocamlmerlin-server dot-merlin-reader: 7 + ln -s _build/install/default/bin/$@ ./$@ 8 + 9 + clean: 10 + dune clean 11 + 12 + test: build 13 + dune runtest 14 + 15 + preprocess: 16 + dune build --always-show-command-line @preprocess 17 + 18 + promote: 19 + dune promote 20 + 21 + node: 22 + cd merlinjs && yarn 23 + 24 + js: node 25 + dune build merlinjs/index.js --profile=release 26 + 27 + js-dev: node 28 + dune build merlinjs/index.js --profile=release --watch 29 + 30 + .PHONY: all js node build dev clean test promote
+25
merlin-js.opam
··· 1 + opam-version: "2.0" 2 + maintainer: "thevoodoos@gmail.com" 3 + authors: "Ulysse Gérard" 4 + homepage: "https://github.com/voodoos/merlin-js" 5 + bug-reports: "https://github.com/voodoos/merlin-js/issues" 6 + dev-repo: "git+https://github.com/voodoos/merlin-js.git" 7 + license: "MIT" 8 + build: [ 9 + ["dune" "subst"] {dev} 10 + ["dune" "build" "-p" name "-j" jobs] 11 + ["dune" "runtest" "-p" "merlin,dot-merlin-reader" "-j" "1"] {with-test} 12 + ] 13 + depends: [ 14 + "ocaml" {>= "4.14" & < "5.00"} 15 + "dune" {>= "2.9.0"} 16 + "merlin" {>= "4.6"} 17 + "yojson" {>= "1.6.0"} 18 + "js_of_ocaml" {>= "4.0.0"} 19 + "brr" {>= "0.0.3"} 20 + "ppx_blob" {>= "0.7.2"} 21 + ] 22 + synopsis: 23 + "Editor helper, provides completion, typing and source browsing for the web" 24 + description: 25 + "Merlin is an assistant for editing OCaml code. It aims to provide the features available in modern browsers: error reporting, auto completion, source browsing and much more."
+10
merlinjs/client/dune
··· 1 + ;(executable 2 + (library 3 + (name merlin_client) 4 + ; (promote (until-clean)) 5 + ; (modes js) 6 + ; (js_of_ocaml 7 + ; (flags (:standard --source-map-inline))) 8 + (libraries 9 + brr 10 + query_protocol))
+64
merlinjs/client/merlin_client.ml
··· 1 + open Brr 2 + module Worker = Brr_webworkers.Worker 3 + 4 + (* When a query is sent to the Worker we keep the Future result in an indexed 5 + table so that the on_message function will be able to determine the Future when 6 + the answer is posted by the Worker. 7 + The Worker works synchronously so we expect answer to arrive in order. *) 8 + type worker = { 9 + worker: Worker.t; 10 + queue: (Jv.t -> unit) Queue.t 11 + } 12 + 13 + let add_fut worker res = Queue.add res worker.queue 14 + let res_fut worker v = (Queue.take worker.queue) v 15 + 16 + let make_worker url = 17 + let worker = Worker.create @@ Jstr.of_string url in 18 + let queue = Queue.create () in 19 + let worker = { worker; queue } in 20 + let on_message m = 21 + let m = Ev.as_type m in 22 + let data = Brr_io.Message.Ev.data m in 23 + res_fut worker data 24 + in 25 + Ev.listen Brr_io.Message.Ev.message on_message @@ 26 + Worker.as_target worker.worker; 27 + worker 28 + 29 + (* todo share that with worker *) 30 + type action = Completion | Type_enclosing | Errors 31 + 32 + let query ~action worker source cursor_offset ((*todo: other queries*)) = 33 + let open Fut.Syntax in 34 + let fut, set = Fut.create () in 35 + add_fut worker set; 36 + Worker.post worker.worker (action, source, cursor_offset); 37 + let+ data : Jv.t = fut in 38 + Console.(log ["Received:"; data]); 39 + (* El.(set_prop p_innerHTML (Jstr.of_string data) results_div); *) 40 + data 41 + 42 + (* let query_to_js ~action worker source cursor_offset = 43 + let source = Jv.to_string source in 44 + Fut.to_promise ~ok:Fun.id @@ 45 + query ~action worker source cursor_offset () 46 + 47 + let make_worker () = make_worker "merlin_worker.bc.js" 48 + let () = Jv.set Jv.global "make_worker" (Jv.repr make_worker) 49 + 50 + let query_completion worker source cursor_offset = 51 + query_to_js ~action:Completion worker source cursor_offset 52 + 53 + let query_type_enclosing worker source cursor_offset = 54 + query_to_js ~action:Type_enclosing worker source cursor_offset *) 55 + 56 + let query_errors worker (source : string) = 57 + query ~action:Errors worker source `Start () 58 + 59 + (* let () = Jv.set Jv.global "query_worker_completion" @@ 60 + Jv.repr query_completion 61 + let () = Jv.set Jv.global "query_worker_type_enclosing" @@ 62 + Jv.repr query_type_enclosing 63 + let () = Jv.set Jv.global "query_worker_errors" @@ 64 + Jv.repr query_errors *)
+28
merlinjs/dune
··· 1 + (executable 2 + (name merlin_worker) 3 + (promote (until-clean)) 4 + (modes js) 5 + ; (js_of_ocaml 6 + ; (flags (:standard --target-env=browser))) 7 + ; (flags (:standard --source-map-inline))) 8 + (libraries 9 + static_files 10 + merlin_kernel 11 + merlin_utils 12 + query_protocol 13 + query_commands 14 + ocaml_parsing 15 + brr 16 + js_of_ocaml)) 17 + 18 + (rule 19 + (deps 20 + merlin_worker.bc.js 21 + client/merlin_client.bc.js 22 + index.jsx 23 + package.json 24 + yarn.lock 25 + (source_tree node_modules)) 26 + (targets index.js) 27 + (mode (promote (until-clean))) 28 + (action (run yarn build)))
+12
merlinjs/editor/dune
··· 1 + (executable 2 + (name merlin_editor) 3 + (promote (until-clean)) 4 + (modes js) 5 + ; (js_of_ocaml 6 + ; (flags (:standard --source-map-inline))) 7 + (libraries 8 + brr 9 + merlin_client 10 + code-mirror 11 + code-mirror.lint 12 + ))
+34
merlinjs/editor/merlin_editor.ml
··· 1 + open Code_mirror 2 + open Brr 3 + 4 + let basic_setup = Jv.get Jv.global "__CM__basic_setup" |> Extension.of_jv 5 + 6 + let get_el_by_id i = 7 + Brr.Document.find_el_by_id G.document (Jstr.of_string i) |> Option.get 8 + 9 + let worker = Merlin_client.make_worker "merlin-worker.bc.js" 10 + 11 + let get_full_doc state = 12 + let lines = Editor.(state |> State.doc |> Text.to_jstr_array) in 13 + lines |> Array.map Jstr.to_string |> Array.to_list |> String.concat "\n" 14 + 15 + let _linter : (Editor.View.t -> Lint.Diagnostic.t array Fut.t) = fun view -> 16 + let doc = get_full_doc @@ Editor.View.state view in 17 + let _result = Merlin_client.query_errors worker doc in 18 + Fut.return [||] 19 + 20 + 21 + 22 + let init ?doc ?(exts = [||]) () = 23 + let open Editor in 24 + let config = 25 + State.Config.create ?doc 26 + ~extensions:(Array.concat [ [| basic_setup |]; exts ]) 27 + () 28 + in 29 + let state = State.create ~config () in 30 + let opts = View.opts ~state ~parent:(get_el_by_id "editor") () in 31 + let view : View.t = View.create ~opts () in 32 + (state, view) 33 + 34 + let _editor = init ()
+74
merlinjs/index.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + 4 + <head> 5 + <meta charset="utf-8"> 6 + <meta name="viewport" content="width=device-width,initial-scale=1.0"> 7 + <script type="text/javascript" defer src="client/merlin_client.bc.js"></script> 8 + <script type="text/javascript" defer src="index.js"></script> 9 + <title>Merlin the web</title> 10 + <style> 11 + @import url('https://fonts.googleapis.com/css2?family=Fira+Code&display=swap'); 12 + 13 + body { 14 + background-color: #4c4956; 15 + font-family: 'Fira Code', monospace 16 + } 17 + 18 + #editor { 19 + min-width: 30rem; 20 + width: 50%; 21 + height: 500px; 22 + border: 1px solid #ddd; 23 + border-radius: 0.5rem; 24 + overflow: hidden; 25 + margin: auto; 26 + margin-top: 2rem; 27 + background-color: white; 28 + } 29 + 30 + @media (max-width: 1200px) { 31 + #editor { 32 + min-width: none; 33 + width: 90%; 34 + } 35 + } 36 + 37 + 38 + .cm-editor { 39 + height: 100%; 40 + } 41 + 42 + .cm-tooltip, 43 + .cm-completionLabel, 44 + .cm-completionMatchedText, 45 + .cm-completionDetail { 46 + font-family: 'Fira Code', monospace; 47 + font-size: 0.8rem; 48 + } 49 + 50 + .cm-editor .cm-tooltip { 51 + max-width: 25rem; 52 + border-radius: 0.25rem; 53 + overflow: hidden; 54 + } 55 + 56 + .cm-editor .cm-tooltip-hover { 57 + padding-left: 0.5rem; 58 + padding-right: 0.5rem; 59 + padding-top: 0.25rem; 60 + padding-bottom: 0.25rem; 61 + } 62 + 63 + .cm-editor .cm-content { 64 + font-family: 'Fira Code', monospace; 65 + } 66 + </style> 67 + </head> 68 + 69 + <body> 70 + <noscript>Sorry, you need to enable JavaScript to see this page.</noscript> 71 + <div id="editor"></div> 72 + </body> 73 + 74 + </html>
+108
merlinjs/index.jsx
··· 1 + import { EditorState, EditorView, basicSetup } from "@codemirror/basic-setup" 2 + import { autocompletion, completeFromList, CompletionContext } from "@codemirror/autocomplete" 3 + import { hoverTooltip } from "@codemirror/tooltip" 4 + import { linter, lintGutter } from "@codemirror/lint" 5 + import { StreamLanguage } from "@codemirror/stream-parser" 6 + import { oCaml } from "@codemirror/legacy-modes/mode/mllike" 7 + 8 + /* I was not able to have the client behave as a module so it needs to be loaded 9 + before-hand in the browser */ 10 + let merlin_worker = make_worker() 11 + 12 + const pos_to_offset = (doc, pos) => doc.line(pos.line).from + pos.col 13 + 14 + /** 15 + * Completion 16 + * 17 + * @param {CompletionContext} context 18 + */ 19 + function merlin_prefix_completion(context /*: CompletionContext */) { 20 + let fulltext = context.state.doc.toJSON().join(context.state.lineBreak) 21 + let result = 22 + query_worker_completion(merlin_worker, fulltext, context.pos) 23 + return result.then(res => { 24 + let options = res.entries.map(entry => ({ 25 + label: entry.name, 26 + detail: entry.desc 27 + })) 28 + return { 29 + from: res.from, 30 + to: res.to, 31 + options, 32 + filter: true 33 + } 34 + }) 35 + } 36 + 37 + /** 38 + * Type enclosing 39 + */ 40 + const type_on_hover = hoverTooltip((view, pos, side) => { 41 + let fulltext = view.state.doc.toJSON().join(view.state.lineBreak) 42 + console.log (query_worker_errors(merlin_worker, fulltext, pos)) 43 + let result = 44 + query_worker_type_enclosing(merlin_worker, fulltext, pos) 45 + return result.then(enclosings => { 46 + let first_enclosing = enclosings.at(0) 47 + console.log("enclosing:", first_enclosing) 48 + let type = first_enclosing.type 49 + return { 50 + pos: pos_to_offset(view.state.doc, first_enclosing.start), 51 + end: pos_to_offset(view.state.doc, first_enclosing.end), 52 + above: true, 53 + create(view) { 54 + let dom = document.createElement("div") 55 + dom.textContent = type 56 + return {dom} 57 + } 58 + } 59 + }) 60 + }) 61 + 62 + /** 63 + * Errors 64 + */ 65 + const errors = linter(view => { 66 + let fulltext = view.state.doc.toJSON().join(view.state.lineBreak) 67 + let result = 68 + query_worker_errors(merlin_worker, fulltext, 0) 69 + return result.then(result => result.map(error => { 70 + return { 71 + from: pos_to_offset(view.state.doc, error.start), 72 + to: pos_to_offset(view.state.doc, error.end), 73 + message: error.message, 74 + severity: "error", 75 + source: error.type 76 + } 77 + })) 78 + }) 79 + 80 + /** 81 + * Syntax 82 + */ 83 + let ocaml = StreamLanguage.define(oCaml) 84 + 85 + let keywords = [ 86 + 'as', 'do', 'else', 'end', 'exception', 'fun', 'functor', 'if', 'in', 87 + 'include', 'let', 'of', 'open', 'rec', 'struct', 'then', 'type', 'val', 88 + 'while', 'with', 'and', 'assert', 'begin', 'class', 'constraint', 89 + 'done', 'downto', 'external', 'function', 'initializer', 'lazy', 90 + 'match', 'method', 'module', 'mutable', 'new', 'nonrec', 'object', 91 + 'private', 'sig', 'to', 'try', 'value', 'virtual', 'when', 92 + ].map(label => ({ 93 + label, 94 + type: "keyword" 95 + })) 96 + 97 + new EditorView({ 98 + state: EditorState.create({ extensions: [ 99 + basicSetup, 100 + ocaml, 101 + type_on_hover, 102 + errors, 103 + // lintGutter(), 104 + autocompletion({override: [ 105 + merlin_prefix_completion, 106 + completeFromList(keywords)]})] }), 107 + parent: document.getElementById('editor') 108 + })
+74
merlinjs/indexperimental.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en"> 3 + 4 + <head> 5 + <meta charset="utf-8"> 6 + <meta name="viewport" content="width=device-width,initial-scale=1.0"> 7 + <script type="text/javascript" defer src="editor/merlin_editor.bc.js"></script> 8 + <!-- <script type="text/javascript" defer src="index.js"></script> --> 9 + <title>Merlin the web</title> 10 + <style> 11 + @import url('https://fonts.googleapis.com/css2?family=Fira+Code&display=swap'); 12 + 13 + body { 14 + background-color: #4c4956; 15 + font-family: 'Fira Code', monospace 16 + } 17 + 18 + #editor { 19 + min-width: 30rem; 20 + width: 50%; 21 + height: 500px; 22 + border: 1px solid #ddd; 23 + border-radius: 0.5rem; 24 + overflow: hidden; 25 + margin: auto; 26 + margin-top: 2rem; 27 + background-color: white; 28 + } 29 + 30 + @media (max-width: 1200px) { 31 + #editor { 32 + min-width: none; 33 + width: 90%; 34 + } 35 + } 36 + 37 + 38 + .cm-editor { 39 + height: 100%; 40 + } 41 + 42 + .cm-tooltip, 43 + .cm-completionLabel, 44 + .cm-completionMatchedText, 45 + .cm-completionDetail { 46 + font-family: 'Fira Code', monospace; 47 + font-size: 0.8rem; 48 + } 49 + 50 + .cm-editor .cm-tooltip { 51 + max-width: 25rem; 52 + border-radius: 0.25rem; 53 + overflow: hidden; 54 + } 55 + 56 + .cm-editor .cm-tooltip-hover { 57 + padding-left: 0.5rem; 58 + padding-right: 0.5rem; 59 + padding-top: 0.25rem; 60 + padding-bottom: 0.25rem; 61 + } 62 + 63 + .cm-editor .cm-content { 64 + font-family: 'Fira Code', monospace; 65 + } 66 + </style> 67 + </head> 68 + 69 + <body> 70 + <noscript>Sorry, you need to enable JavaScript to see this page.</noscript> 71 + <div id="editor"></div> 72 + </body> 73 + 74 + </html>
+181
merlinjs/merlin_worker.ml
··· 1 + open Merlin_utils 2 + open Brr 3 + open Std 4 + 5 + (* Load the CMIs into the pseudo file-system *) 6 + (* This add roughly 3mo to the final script. These could be loaded dynamically 7 + after the worker *) 8 + let () = List.iter ~f:(fun (path, content) -> 9 + let name = Filename.(concat "/static/stdlib" (basename path)) in 10 + Js_of_ocaml.Sys_js.create_file ~name ~content 11 + ) Static_files.stdlib_cmis 12 + 13 + let config = 14 + let initial = Mconfig.initial in 15 + { initial with 16 + merlin = { initial.merlin with 17 + stdlib = Some "/static/stdlib" }} 18 + 19 + let make_pipeline source = 20 + Mpipeline.make config source 21 + 22 + let dispatch source query = 23 + let pipeline = make_pipeline source in 24 + Mpipeline.with_pipeline pipeline @@ fun () -> 25 + Query_commands.dispatch pipeline query 26 + |> Query_json.json_of_response query 27 + |> Json.to_string 28 + 29 + 30 + module Completion = struct 31 + (* Prefixing code from ocaml-lsp-server *) 32 + let rfindi = 33 + let rec loop s ~f i = 34 + if i < 0 then 35 + None 36 + else if f (String.unsafe_get s i) then 37 + Some i 38 + else 39 + loop s ~f (i - 1) 40 + in 41 + fun ?from s ~f -> 42 + let from = 43 + let len = String.length s in 44 + match from with 45 + | None -> len - 1 46 + | Some i -> 47 + if i > len - 1 then 48 + raise @@ Invalid_argument "rfindi: invalid from" 49 + else 50 + i 51 + in 52 + loop s ~f from 53 + let lsplit2 s ~on = 54 + match String.index_opt s on with 55 + | None -> None 56 + | Some i -> 57 + let open String in 58 + Some (sub s ~pos:0 ~len:i, sub s ~pos:(i + 1) ~len:(length s - i - 1)) 59 + 60 + (** @see <https://ocaml.org/manual/lex.html> reference *) 61 + let prefix_of_position ?(short_path = false) source position = 62 + match Msource.text source with 63 + | "" -> "" 64 + | text -> 65 + let from = 66 + let (`Offset index) = Msource.get_offset source position in 67 + min (String.length text - 1) (index - 1) 68 + in 69 + let pos = 70 + let should_terminate = ref false in 71 + let has_seen_dot = ref false in 72 + let is_prefix_char c = 73 + if !should_terminate then 74 + false 75 + else 76 + match c with 77 + | 'a' .. 'z' | 'A' .. 'Z' | '0' .. '9' | '\'' | '_' 78 + (* Infix function characters *) 79 + | '$' | '&' | '*' | '+' | '-' | '/' | '=' | '>' 80 + | '@' | '^' | '!' | '?' | '%' | '<' | ':' | '~' | '#' -> 81 + true 82 + | '`' -> 83 + if !has_seen_dot then 84 + false 85 + else ( 86 + should_terminate := true; 87 + true 88 + ) | '.' -> 89 + has_seen_dot := true; 90 + not short_path 91 + | _ -> false 92 + in 93 + rfindi text ~from ~f:(fun c -> not (is_prefix_char c)) 94 + in 95 + let pos = 96 + match pos with 97 + | None -> 0 98 + | Some pos -> pos + 1 99 + in 100 + let len = from - pos + 1 in 101 + let reconstructed_prefix = String.sub text ~pos ~len in 102 + (* if we reconstructed [~f:ignore] or [?f:ignore], we should take only 103 + [ignore], so: *) 104 + if 105 + String.is_prefixed ~by:"~" reconstructed_prefix 106 + || String.is_prefixed ~by:"?" reconstructed_prefix 107 + then 108 + match lsplit2 reconstructed_prefix ~on:':' with 109 + | Some (_, s) -> s 110 + | None -> reconstructed_prefix 111 + else 112 + reconstructed_prefix 113 + 114 + 115 + let at_pos source position = 116 + let prefix = prefix_of_position source position in 117 + let `Offset to_ = Msource.get_offset source position in 118 + let from = 119 + to_ - String.length (prefix_of_position ~short_path:true source position) 120 + in 121 + 122 + Console.(log ["Prefix:";prefix]); 123 + if prefix = "" then 124 + None 125 + else 126 + let query = Query_protocol.Complete_prefix (prefix, position, [], true, true) 127 + in 128 + Some (from, to_, dispatch source query) 129 + end 130 + 131 + let dump () = 132 + let query = Query_protocol.Dump [`String "paths"] in 133 + dispatch (Msource.make "") query 134 + 135 + let dump_config () = 136 + let pipeline = make_pipeline (Msource.make "") in 137 + Mpipeline.with_pipeline pipeline @@ fun () -> 138 + Mconfig.dump (Mpipeline.final_config pipeline) 139 + |> Json.pretty_to_string 140 + 141 + 142 + (* todo share that with worker *) 143 + type action = Completion | Type_enclosing | Errors 144 + [@@ocaml.warning "-37"] 145 + 146 + let on_message e = 147 + let (action, data, cursor_offset) as m = Brr_io.Message.Ev.data e in 148 + Console.(log ["Received message:"; m]); 149 + let source = Msource.make data in 150 + let position = `Offset cursor_offset in 151 + let res = 152 + match action with 153 + | Completion -> begin 154 + match Completion.at_pos source position with 155 + | None -> 156 + Jv.obj [| ("from", Jv.of_int 0); ("to", Jv.of_int 0); ("entries", Jv.Jarray.create 0) |] 157 + | Some (from, to_, compl) -> 158 + let entries = Brr.Json.decode @@ Jstr.of_string compl 159 + |> Stdlib.Result.get_ok in 160 + Jv.obj [| ("from", Jv.of_int from); ("to", Jv.of_int to_); ("entries", Jv.get entries "entries") |] end 161 + | Type_enclosing -> 162 + let query = Query_protocol.Type_enclosing (None, position, None) in 163 + let result_string = dispatch source query in 164 + Brr.Json.decode @@ Jstr.of_string result_string 165 + |> Stdlib.Result.get_ok 166 + | Errors -> 167 + let query = Query_protocol.Errors { 168 + lexing = true; 169 + parsing = true; 170 + typing = true; 171 + } 172 + in 173 + let result_string = dispatch source query in 174 + Brr.Json.decode @@ Jstr.of_string result_string 175 + |> Stdlib.Result.get_ok 176 + in 177 + Brr_webworkers.Worker.G.post res 178 + 179 + let () = Jv.(set global "onmessage" @@ Jv.repr on_message) 180 + 181 + let () = Console.(log [dump (); dump_config ()])
+15
merlinjs/package.json
··· 1 + { 2 + "name": "merlin-js", 3 + "version": "0.0.1", 4 + "description": "A version of Merlin for the web", 5 + "main": "index.js", 6 + "license": "MIT", 7 + "dependencies": { 8 + "@codemirror/basic-setup": "^0.19.3", 9 + "@codemirror/legacy-modes": "^0.19.1", 10 + "esbuild": "^0.14.29" 11 + }, 12 + "scripts": { 13 + "build": "./node_modules/esbuild/bin/esbuild index.jsx --bundle --outfile=index.js" 14 + } 15 + }
+421
merlinjs/query_json.ml
··· 1 + (* {{{ COPYING *( 2 + 3 + This file is part of Merlin, an helper for ocaml editors 4 + 5 + Copyright (C) 2013 - 2015 Frédéric Bour <frederic.bour(_)lakaban.net> 6 + Thomas Refis <refis.thomas(_)gmail.com> 7 + Simon Castellan <simon.castellan(_)iuwt.fr> 8 + 9 + Permission is hereby granted, free of charge, to any person obtaining a 10 + copy of this software and associated documentation files (the "Software"), 11 + to deal in the Software without restriction, including without limitation the 12 + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 13 + sell copies of the Software, and to permit persons to whom the Software is 14 + furnished to do so, subject to the following conditions: 15 + 16 + The above copyright notice and this permission notice shall be included in 17 + all copies or substantial portions of the Software. 18 + 19 + The Software is provided "as is", without warranty of any kind, express or 20 + implied, including but not limited to the warranties of merchantability, 21 + fitness for a particular purpose and noninfringement. In no event shall 22 + the authors or copyright holders be liable for any claim, damages or other 23 + liability, whether in an action of contract, tort or otherwise, arising 24 + from, out of or in connection with the software or the use or other dealings 25 + in the Software. 26 + 27 + )* }}} *) 28 + 29 + open Merlin_utils.Std 30 + module Location = Ocaml_parsing.Location 31 + open Query_protocol 32 + 33 + let dump (type a) : a t -> json = 34 + let mk command args = 35 + `Assoc ( 36 + ("command", `String command) :: 37 + args 38 + ) in 39 + let mk_position = function 40 + | `Start -> `String "start" 41 + | `End -> `String "end" 42 + | `Offset n -> 43 + `Assoc ["offset", `Int n] 44 + | `Logical (line,col) -> 45 + `Assoc ["line", `Int line; "column", `Int col] 46 + in 47 + let kinds_to_json kind = 48 + `List (List.map ~f:(function 49 + | `Constructor -> `String "constructor" 50 + | `Keywords -> `String "keywords" 51 + | `Labels -> `String "label" 52 + | `Modules -> `String "module" 53 + | `Modules_type -> `String "module-type" 54 + | `Types -> `String "type" 55 + | `Values -> `String "value" 56 + | `Variants -> `String "variant" 57 + ) kind) 58 + in 59 + function 60 + | Type_expr (expr, pos) -> 61 + mk "type-expression" [ 62 + "expression", `String expr; 63 + "position", mk_position pos; 64 + ] 65 + 66 + | Type_enclosing (opt_cursor, pos, index) -> 67 + mk "type-enclosing" [ 68 + "cursor", (match opt_cursor with 69 + | None -> `Null 70 + | Some (text, offset) -> `Assoc [ 71 + "text", `String text; 72 + "offset", `Int offset; 73 + ] 74 + ); 75 + "index", (match index with 76 + | None -> `String "all" 77 + | Some n -> `Int n 78 + ); 79 + "position", mk_position pos; 80 + ] 81 + 82 + | Locate_type pos -> 83 + mk "locate-type" [ 84 + "position", mk_position pos 85 + ] 86 + 87 + | Enclosing pos -> 88 + mk "enclosing" [ 89 + "position", mk_position pos; 90 + ] 91 + 92 + | Complete_prefix (prefix, pos, kind, doc, typ) -> 93 + mk "complete-prefix" [ 94 + "prefix", `String prefix; 95 + "position", mk_position pos; 96 + "with-doc", `Bool doc; 97 + "with-types", `Bool typ; 98 + "kind", kinds_to_json kind; 99 + ] 100 + 101 + | Expand_prefix (prefix, pos, kind, typ) -> 102 + mk "expand-prefix" [ 103 + "prefix", `String prefix; 104 + "position", mk_position pos; 105 + "with-types", `Bool typ; 106 + "kind", kinds_to_json kind; 107 + ] 108 + | Document (identifier, pos) -> 109 + mk "document" [ 110 + "identifier", (match identifier with 111 + | None -> `Null 112 + | Some ident -> `String ident 113 + ); 114 + "position", mk_position pos; 115 + ] 116 + | Locate (prefix, look_for, pos) -> 117 + mk "locate" [ 118 + "prefix", (match prefix with 119 + | None -> `Null 120 + | Some prefix -> `String prefix 121 + ); 122 + "look-for", (match look_for with 123 + | `ML -> `String "implementation" 124 + | `MLI -> `String "interface" 125 + ); 126 + "position", mk_position pos; 127 + ] 128 + | Jump (target, pos) -> 129 + mk "jump" [ 130 + "target", `String target; 131 + "position", mk_position pos; 132 + ] 133 + | Phrase (target, pos) -> 134 + mk "phrase" [ 135 + "target", `String (match target with `Next -> "next" | `Prev -> "prev"); 136 + "position", mk_position pos; 137 + ] 138 + | Case_analysis (pos_start,pos_end) -> 139 + mk "case-analysis" [ 140 + "start", mk_position pos_start; 141 + "end", mk_position pos_end; 142 + ] 143 + | Holes -> mk "holes" [] 144 + | Construct (pos, with_values, depth) -> 145 + let depth = Option.value ~default:1 depth in 146 + mk "construct" [ 147 + "position", mk_position pos; 148 + "with_values", (match with_values with 149 + | Some `None | None -> `String "none" 150 + | Some `Local -> `String "local" 151 + ); 152 + "depth", `Int depth 153 + ] 154 + | Outline -> mk "outline" [] 155 + | Errors { lexing; parsing; typing } -> 156 + let args = 157 + if lexing && parsing && typing 158 + then [] 159 + else [ 160 + "lexing", `Bool lexing; 161 + "parsing", `Bool parsing; 162 + "typing", `Bool typing; 163 + ] 164 + in 165 + mk "errors" args 166 + | Shape pos -> 167 + mk "shape" [ 168 + "position", mk_position pos; 169 + ] 170 + | Dump args -> 171 + mk "dump" [ 172 + "args", `List args 173 + ] 174 + | Path_of_source paths -> 175 + mk "path-of-source" [ 176 + "paths", `List (List.map ~f:Json.string paths) 177 + ] 178 + | List_modules exts -> 179 + mk "list-modules" [ 180 + "extensions", `List (List.map ~f:Json.string exts) 181 + ] 182 + | Findlib_list -> mk "findlib-list" [] 183 + | Extension_list status -> 184 + mk "extension-list" [ 185 + "filter", (match status with 186 + | `All -> `String "all" 187 + | `Enabled -> `String "enabled" 188 + | `Disabled -> `String "disabled" 189 + ); 190 + ] 191 + | Path_list var -> 192 + mk "path-list" [ 193 + "variable", (match var with 194 + | `Build -> `String "build" 195 + | `Source -> `String "source" 196 + ); 197 + ] 198 + | Polarity_search (query, pos) -> 199 + mk "polarity-search" [ 200 + "query", `String query; 201 + "position", mk_position pos; 202 + ] 203 + | Occurrences (`Ident_at pos) -> 204 + mk "occurrences" [ 205 + "kind", `String "identifiers"; 206 + "position", mk_position pos; 207 + ] 208 + | Refactor_open (action, pos) -> 209 + mk "refactor-open" [ 210 + "action", `String (match action with `Qualify -> "qualify" 211 + | `Unqualify -> "unqualify"); 212 + "position", mk_position pos; 213 + ] 214 + | Version -> mk "version" [] 215 + 216 + let string_of_completion_kind = function 217 + | `Value -> "Value" 218 + | `Variant -> "Variant" 219 + | `Constructor -> "Constructor" 220 + | `Label -> "Label" 221 + | `Module -> "Module" 222 + | `Modtype -> "Signature" 223 + | `Type -> "Type" 224 + | `Method -> "Method" 225 + | `MethodCall -> "#" 226 + | `Exn -> "Exn" 227 + | `Class -> "Class" 228 + | `Keyword -> "Keyword" 229 + 230 + let with_location ?(skip_none=false) loc assoc = 231 + if skip_none && loc = Location.none then 232 + `Assoc assoc 233 + else 234 + `Assoc (("start", Lexing.json_of_position loc.Location.loc_start) :: 235 + ("end", Lexing.json_of_position loc.Location.loc_end) :: 236 + assoc) 237 + 238 + let json_of_type_loc (loc,desc,tail) = 239 + with_location loc [ 240 + "type", (match desc with 241 + | `String _ as str -> str 242 + | `Index n -> `Int n); 243 + "tail", `String (match tail with 244 + | `No -> "no" 245 + | `Tail_position -> "position" 246 + | `Tail_call -> "call") 247 + ] 248 + 249 + let json_of_error (error : Location.error) = 250 + let of_sub loc sub = 251 + let msg = 252 + Location.print_sub_msg Format.str_formatter sub; 253 + String.trim (Format.flush_str_formatter ()) 254 + in 255 + with_location ~skip_none:true loc ["message", `String msg] 256 + in 257 + let loc = Location.loc_of_report error in 258 + let msg = 259 + Format.asprintf "@[%a@]" Location.print_main error |> String.trim 260 + in 261 + let typ = 262 + match error.source with 263 + | Location.Lexer -> "lexer" 264 + | Location.Parser -> "parser" 265 + | Location.Typer -> "typer" 266 + | Location.Warning -> 267 + if String.is_prefixed ~by:"Error" msg then 268 + "typer" (* Handle warn-error (since 4.08) *) 269 + else 270 + "warning" 271 + | Location.Unknown -> "unknown" 272 + | Location.Env -> "env" 273 + | Location.Config -> "config" 274 + in 275 + let content = [ 276 + "type" , `String typ; 277 + "sub" , `List (List.map ~f:(of_sub loc) error.sub); 278 + "valid" , `Bool true; 279 + "message" , `String msg; 280 + ] in 281 + with_location ~skip_none:true loc content 282 + 283 + let json_of_completion {Compl. name; kind; desc; info; deprecated} = 284 + `Assoc ["name", `String name; 285 + "kind", `String (string_of_completion_kind kind); 286 + "desc", `String desc; 287 + "info", `String info; 288 + "deprecated", `Bool deprecated] 289 + 290 + let json_of_completions {Compl. entries; context } = 291 + `Assoc [ 292 + "entries", `List (List.map ~f:json_of_completion entries); 293 + "context", (match context with 294 + | `Unknown -> `Null 295 + | `Application {Compl. argument_type; labels} -> 296 + let label (name,ty) = `Assoc ["name", `String name; 297 + "type", `String ty] in 298 + let a = `Assoc ["argument_type", `String argument_type; 299 + "labels", `List (List.map ~f:label labels)] in 300 + `List [`String "application"; a]) 301 + ] 302 + 303 + let rec json_of_outline outline = 304 + let json_of_item { outline_name ; outline_kind ; outline_type; location ; children ; deprecated } = 305 + with_location location [ 306 + "name", `String outline_name; 307 + "kind", `String (string_of_completion_kind outline_kind); 308 + "type", (match outline_type with 309 + | None -> `Null 310 + | Some typ -> `String typ); 311 + "children", `List (json_of_outline children); 312 + "deprecated", `Bool deprecated 313 + ] 314 + in 315 + List.map ~f:json_of_item outline 316 + 317 + let rec json_of_shape { shape_loc; shape_sub } = 318 + with_location shape_loc [ 319 + "children", `List (List.map ~f:json_of_shape shape_sub); 320 + ] 321 + 322 + let json_of_locate resp = 323 + match resp with 324 + | `At_origin -> `String "Already at definition point" 325 + | `Builtin s -> 326 + `String (sprintf "%S is a builtin, and it is therefore impossible \ 327 + to jump to its definition" s) 328 + | `Invalid_context -> `String "Not a valid identifier" 329 + | `Not_found (id, None) -> `String ("didn't manage to find " ^ id) 330 + | `Not_found (i, Some f) -> 331 + `String 332 + (sprintf "%s was supposed to be in %s but could not be found" i f) 333 + | `Not_in_env str -> 334 + `String (Printf.sprintf "Not in environment '%s'" str) 335 + | `File_not_found msg -> 336 + `String msg 337 + | `Found (None,pos) -> 338 + `Assoc ["pos", Lexing.json_of_position pos] 339 + | `Found (Some file,pos) -> 340 + `Assoc ["file",`String file; "pos", Lexing.json_of_position pos] 341 + 342 + let json_of_response (type a) (query : a t) (response : a) : json = 343 + match query, response with 344 + | Type_expr _, str -> `String str 345 + | Type_enclosing _, results -> 346 + `List (List.map ~f:json_of_type_loc results) 347 + | Enclosing _, results -> 348 + `List (List.map ~f:(fun loc -> with_location loc []) results) 349 + | Complete_prefix _, compl -> 350 + json_of_completions compl 351 + | Expand_prefix _, compl -> 352 + json_of_completions compl 353 + | Polarity_search _, compl -> 354 + json_of_completions compl 355 + | Refactor_open _, locations -> 356 + `List (List.map locations ~f:(fun (name,loc) -> 357 + with_location loc ["content",`String name])) 358 + | Document _, resp -> 359 + begin match resp with 360 + | `No_documentation -> `String "No documentation available" 361 + | `Invalid_context -> `String "Not a valid identifier" 362 + | `Builtin s -> 363 + `String (sprintf "%S is a builtin, no documentation is available" s) 364 + | `Not_found (id, None) -> `String ("didn't manage to find " ^ id) 365 + | `Not_found (i, Some f) -> 366 + `String 367 + (sprintf "%s was supposed to be in %s but could not be found" i f) 368 + | `Not_in_env str -> 369 + `String (Printf.sprintf "Not in environment '%s'" str) 370 + | `File_not_found msg -> 371 + `String msg 372 + | `Found doc -> 373 + `String doc 374 + end 375 + | Locate_type _, resp -> json_of_locate resp 376 + | Locate _, resp -> json_of_locate resp 377 + | Jump _, resp -> 378 + begin match resp with 379 + | `Error str -> 380 + `String str 381 + | `Found pos -> 382 + `Assoc ["pos", Lexing.json_of_position pos] 383 + end 384 + | Phrase _, pos -> 385 + `Assoc ["pos", Lexing.json_of_position pos] 386 + | Case_analysis _, ({ Location. loc_start ; loc_end; _ }, str) -> 387 + let assoc = 388 + `Assoc [ 389 + "start", Lexing.json_of_position loc_start ; 390 + "end", Lexing.json_of_position loc_end ; 391 + ] 392 + in 393 + `List [ assoc ; `String str ] 394 + | Holes, locations -> 395 + `List (List.map locations 396 + ~f:(fun (loc, typ) -> with_location loc ["type", `String typ])) 397 + | Construct _, ({ Location. loc_start ; loc_end; _ }, strs) -> 398 + let assoc = 399 + `Assoc [ 400 + "start", Lexing.json_of_position loc_start ; 401 + "end", Lexing.json_of_position loc_end ; 402 + ] 403 + in 404 + `List [ assoc ; `List (List.map ~f:Json.string strs) ] 405 + | Outline, outlines -> 406 + `List (json_of_outline outlines) 407 + | Shape _, shapes -> 408 + `List (List.map ~f:json_of_shape shapes) 409 + | Errors _, errors -> 410 + `List (List.map ~f:json_of_error errors) 411 + | Dump _, json -> json 412 + | Path_of_source _, str -> `String str 413 + | List_modules _, strs -> `List (List.map ~f:Json.string strs) 414 + | Findlib_list, strs -> `List (List.map ~f:Json.string strs) 415 + | Extension_list _, strs -> `List (List.map ~f:Json.string strs) 416 + | Path_list _, strs -> `List (List.map ~f:Json.string strs) 417 + | Occurrences _, locations -> 418 + `List (List.map locations 419 + ~f:(fun loc -> with_location loc [])) 420 + | Version, version -> 421 + `String version
+13
merlinjs/static/dune
··· 1 + (data_only_dirs stdlib) 2 + 3 + (library 4 + (name static_files) 5 + (modules static_files) 6 + (preprocess (pps ppx_blob)) 7 + (preprocessor_deps 8 + (glob_files stdlib/*.cmi))) 9 + 10 + (rule 11 + (target static_files.ml) 12 + (deps (glob_files stdlib/*.cmi)) 13 + (action (run ocaml %{dep:gen_static.ml})))
+25
merlinjs/static/gen_static.ml
··· 1 + #use "topfind" ;; 2 + #require "unix";; 3 + 4 + 5 + let rec iter_cmi ~f dir_handle = 6 + match Unix.readdir dir_handle with 7 + | exception End_of_file -> () 8 + | file -> 9 + if Filename.extension file = ".cmi" then 10 + f file; 11 + iter_cmi ~f dir_handle 12 + 13 + let () = 14 + let cwd = Unix.getcwd () in 15 + let stdlib = Filename.concat cwd "stdlib" in 16 + let out = open_out "static_files.ml" in 17 + 18 + Printf.fprintf out "let stdlib_cmis = ["; 19 + let dir = Unix.opendir stdlib in 20 + iter_cmi ~f:(fun file -> 21 + let fullpath = Filename.concat stdlib file in 22 + Printf.fprintf out "(%S,[%%blob %S]);" fullpath fullpath) dir; 23 + Printf.fprintf out "]\n"; 24 + 25 + close_out out
merlinjs/static/stdlib/arith_status.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/big_int.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/bigarray.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/camlinternalAtomic.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/camlinternalFormat.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/camlinternalFormatBasics.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/camlinternalLazy.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/camlinternalMod.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/camlinternalOO.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/dynlink.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/nat.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/num.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/profiling.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/ratio.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/std_exit.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Arg.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Array.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__ArrayLabels.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Atomic.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Bigarray.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Bool.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Buffer.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Bytes.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__BytesLabels.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Callback.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Char.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Complex.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Digest.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Either.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Ephemeron.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Filename.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Float.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Format.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Fun.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Gc.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Genlex.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Hashtbl.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Int.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Int32.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Int64.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Lazy.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Lexing.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__List.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__ListLabels.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Map.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Marshal.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__MoreLabels.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Nativeint.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Obj.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Oo.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Option.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Parsing.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Pervasives.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Printexc.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Printf.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Queue.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Random.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Result.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Scanf.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Seq.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Set.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Stack.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__StdLabels.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Stream.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__String.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__StringLabels.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Sys.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Uchar.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Unit.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/stdlib__Weak.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/str.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/topdirs.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/unix.cmi

This is a binary file and will not be displayed.

merlinjs/static/stdlib/unixLabels.cmi

This is a binary file and will not be displayed.

+381
merlinjs/yarn.lock
··· 1 + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 + # yarn lockfile v1 3 + 4 + 5 + "@codemirror/autocomplete@^0.19.0": 6 + version "0.19.15" 7 + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-0.19.15.tgz#061f09063dc2a68668d85d7ac8430c7bc6df1a82" 8 + integrity sha512-GQWzvvuXxNUyaEk+5gawbAD8s51/v2Chb++nx0e2eGWrphWk42isBtzOMdc3DxrxrZtPZ55q2ldNp+6G8KJLIQ== 9 + dependencies: 10 + "@codemirror/language" "^0.19.0" 11 + "@codemirror/state" "^0.19.4" 12 + "@codemirror/text" "^0.19.2" 13 + "@codemirror/tooltip" "^0.19.12" 14 + "@codemirror/view" "^0.19.0" 15 + "@lezer/common" "^0.15.0" 16 + 17 + "@codemirror/basic-setup@^0.19.3": 18 + version "0.19.3" 19 + resolved "https://registry.yarnpkg.com/@codemirror/basic-setup/-/basic-setup-0.19.3.tgz#b83e3ee43f632c0305f97771767d84c753d41a6b" 20 + integrity sha512-2hfO+QDk/HTpQzeYk1NyL1G9D5L7Sj78dtaQP8xBU42DKU9+OBPF5MdjLYnxP0jKzm6IfQfsLd89fnqW3rBVfQ== 21 + dependencies: 22 + "@codemirror/autocomplete" "^0.19.0" 23 + "@codemirror/closebrackets" "^0.19.0" 24 + "@codemirror/commands" "^0.19.0" 25 + "@codemirror/comment" "^0.19.0" 26 + "@codemirror/fold" "^0.19.0" 27 + "@codemirror/gutter" "^0.19.0" 28 + "@codemirror/highlight" "^0.19.0" 29 + "@codemirror/history" "^0.19.0" 30 + "@codemirror/language" "^0.19.0" 31 + "@codemirror/lint" "^0.19.0" 32 + "@codemirror/matchbrackets" "^0.19.0" 33 + "@codemirror/rectangular-selection" "^0.19.2" 34 + "@codemirror/search" "^0.19.0" 35 + "@codemirror/state" "^0.19.0" 36 + "@codemirror/view" "^0.19.31" 37 + 38 + "@codemirror/closebrackets@^0.19.0": 39 + version "0.19.2" 40 + resolved "https://registry.yarnpkg.com/@codemirror/closebrackets/-/closebrackets-0.19.2.tgz#ff74dd78218cee57172623eb9ebf7b669fa6f4d4" 41 + integrity sha512-ClMPzPcPP0eQiDcVjtVPl6OLxgdtZSYDazsvT0AKl70V1OJva0eHgl4/6kCW3RZ0pb2n34i9nJz4eXCmK+TYDA== 42 + dependencies: 43 + "@codemirror/language" "^0.19.0" 44 + "@codemirror/rangeset" "^0.19.0" 45 + "@codemirror/state" "^0.19.2" 46 + "@codemirror/text" "^0.19.0" 47 + "@codemirror/view" "^0.19.44" 48 + 49 + "@codemirror/commands@^0.19.0": 50 + version "0.19.8" 51 + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-0.19.8.tgz#1f99c1a8bf200d17c4d6997379099459f3678107" 52 + integrity sha512-65LIMSGUGGpY3oH6mzV46YWRrgao6NmfJ+AuC7jNz3K5NPnH6GCV1H5I6SwOFyVbkiygGyd0EFwrWqywTBD1aw== 53 + dependencies: 54 + "@codemirror/language" "^0.19.0" 55 + "@codemirror/matchbrackets" "^0.19.0" 56 + "@codemirror/state" "^0.19.2" 57 + "@codemirror/text" "^0.19.6" 58 + "@codemirror/view" "^0.19.22" 59 + "@lezer/common" "^0.15.0" 60 + 61 + "@codemirror/comment@^0.19.0": 62 + version "0.19.1" 63 + resolved "https://registry.yarnpkg.com/@codemirror/comment/-/comment-0.19.1.tgz#7def8345eeb9095ef1ef33676fbde1ab4fe33fad" 64 + integrity sha512-uGKteBuVWAC6fW+Yt8u27DOnXMT/xV4Ekk2Z5mRsiADCZDqYvryrJd6PLL5+8t64BVyocwQwNfz1UswYS2CtFQ== 65 + dependencies: 66 + "@codemirror/state" "^0.19.9" 67 + "@codemirror/text" "^0.19.0" 68 + "@codemirror/view" "^0.19.0" 69 + 70 + "@codemirror/fold@^0.19.0": 71 + version "0.19.3" 72 + resolved "https://registry.yarnpkg.com/@codemirror/fold/-/fold-0.19.3.tgz#de55d44a7313f2a8920aefb6ebf9eff34715d8d4" 73 + integrity sha512-8hT+Eq2G68mL0yPRvSD2ewhnLQAX6sbUJmtGVKFcj8oAXtfpYCX8LIcfXsuI19Qs7gZkOSpqZvn+KKj8IhZoAw== 74 + dependencies: 75 + "@codemirror/gutter" "^0.19.0" 76 + "@codemirror/language" "^0.19.0" 77 + "@codemirror/rangeset" "^0.19.0" 78 + "@codemirror/state" "^0.19.0" 79 + "@codemirror/view" "^0.19.22" 80 + 81 + "@codemirror/gutter@^0.19.0", "@codemirror/gutter@^0.19.4": 82 + version "0.19.9" 83 + resolved "https://registry.yarnpkg.com/@codemirror/gutter/-/gutter-0.19.9.tgz#bbb69f4d49570d9c1b3f3df5d134980c516cd42b" 84 + integrity sha512-PFrtmilahin1g6uL27aG5tM/rqR9DZzZYZsIrCXA5Uc2OFTFqx4owuhoU9hqfYxHp5ovfvBwQ+txFzqS4vog6Q== 85 + dependencies: 86 + "@codemirror/rangeset" "^0.19.0" 87 + "@codemirror/state" "^0.19.0" 88 + "@codemirror/view" "^0.19.23" 89 + 90 + "@codemirror/highlight@^0.19.0": 91 + version "0.19.8" 92 + resolved "https://registry.yarnpkg.com/@codemirror/highlight/-/highlight-0.19.8.tgz#a95aee8ae4389b01f820aa79c48f7b4388087d92" 93 + integrity sha512-v/lzuHjrYR8MN2mEJcUD6fHSTXXli9C1XGYpr+ElV6fLBIUhMTNKR3qThp611xuWfXfwDxeL7ppcbkM/MzPV3A== 94 + dependencies: 95 + "@codemirror/language" "^0.19.0" 96 + "@codemirror/rangeset" "^0.19.0" 97 + "@codemirror/state" "^0.19.3" 98 + "@codemirror/view" "^0.19.39" 99 + "@lezer/common" "^0.15.0" 100 + style-mod "^4.0.0" 101 + 102 + "@codemirror/history@^0.19.0": 103 + version "0.19.2" 104 + resolved "https://registry.yarnpkg.com/@codemirror/history/-/history-0.19.2.tgz#25e3fda755f77ac1223a6ae6e9d7899f5919265e" 105 + integrity sha512-unhP4t3N2smzmHoo/Yio6ueWi+il8gm9VKrvi6wlcdGH5fOfVDNkmjHQ495SiR+EdOG35+3iNebSPYww0vN7ow== 106 + dependencies: 107 + "@codemirror/state" "^0.19.2" 108 + "@codemirror/view" "^0.19.0" 109 + 110 + "@codemirror/language@^0.19.0": 111 + version "0.19.10" 112 + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-0.19.10.tgz#c3d1330fa5de778c6b6b5177af5572a3d9d596b5" 113 + integrity sha512-yA0DZ3RYn2CqAAGW62VrU8c4YxscMQn45y/I9sjBlqB1e2OTQLg4CCkMBuMSLXk4xaqjlsgazeOQWaJQOKfV8Q== 114 + dependencies: 115 + "@codemirror/state" "^0.19.0" 116 + "@codemirror/text" "^0.19.0" 117 + "@codemirror/view" "^0.19.0" 118 + "@lezer/common" "^0.15.5" 119 + "@lezer/lr" "^0.15.0" 120 + 121 + "@codemirror/legacy-modes@^0.19.1": 122 + version "0.19.1" 123 + resolved "https://registry.yarnpkg.com/@codemirror/legacy-modes/-/legacy-modes-0.19.1.tgz#7dc3b5df1842060648f75764ab6919fcfce3ea1a" 124 + integrity sha512-vYPLsD/ON+3SXhlGj9Qb3fpFNNU3Ya/AtDiv/g3OyqVzhh5vs5rAnOvk8xopGWRwppdhlNPD9VyXjiOmZUQtmQ== 125 + dependencies: 126 + "@codemirror/stream-parser" "^0.19.0" 127 + 128 + "@codemirror/lint@^0.19.0": 129 + version "0.19.6" 130 + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-0.19.6.tgz#0379688da3e16739db4a6304c73db857ca85d7ec" 131 + integrity sha512-Pbw1Y5kHVs2J+itQ0uez3dI4qY9ApYVap7eNfV81x1/3/BXgBkKfadaw0gqJ4h4FDG7OnJwb0VbPsjJQllHjaA== 132 + dependencies: 133 + "@codemirror/gutter" "^0.19.4" 134 + "@codemirror/panel" "^0.19.0" 135 + "@codemirror/rangeset" "^0.19.1" 136 + "@codemirror/state" "^0.19.4" 137 + "@codemirror/tooltip" "^0.19.16" 138 + "@codemirror/view" "^0.19.22" 139 + crelt "^1.0.5" 140 + 141 + "@codemirror/matchbrackets@^0.19.0": 142 + version "0.19.4" 143 + resolved "https://registry.yarnpkg.com/@codemirror/matchbrackets/-/matchbrackets-0.19.4.tgz#50b5188eb2d53f32598dca906bf5fd66626a9ebc" 144 + integrity sha512-VFkaOKPNudAA5sGP1zikRHCEKU0hjYmkKpr04pybUpQvfTvNJXlReCyP0rvH/1iEwAGPL990ZTT+QrLdu4MeEA== 145 + dependencies: 146 + "@codemirror/language" "^0.19.0" 147 + "@codemirror/state" "^0.19.0" 148 + "@codemirror/view" "^0.19.0" 149 + "@lezer/common" "^0.15.0" 150 + 151 + "@codemirror/panel@^0.19.0": 152 + version "0.19.1" 153 + resolved "https://registry.yarnpkg.com/@codemirror/panel/-/panel-0.19.1.tgz#bf77d27b962cf16357139e50864d0eb69d634441" 154 + integrity sha512-sYeOCMA3KRYxZYJYn5PNlt9yNsjy3zTNTrbYSfVgjgL9QomIVgOJWPO5hZ2sTN8lufO6lw0vTBsIPL9MSidmBg== 155 + dependencies: 156 + "@codemirror/state" "^0.19.0" 157 + "@codemirror/view" "^0.19.0" 158 + 159 + "@codemirror/rangeset@^0.19.0", "@codemirror/rangeset@^0.19.1", "@codemirror/rangeset@^0.19.5": 160 + version "0.19.9" 161 + resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.19.9.tgz#e80895de93c39dc7899f5be31d368c9d88aa4efc" 162 + integrity sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ== 163 + dependencies: 164 + "@codemirror/state" "^0.19.0" 165 + 166 + "@codemirror/rectangular-selection@^0.19.2": 167 + version "0.19.2" 168 + resolved "https://registry.yarnpkg.com/@codemirror/rectangular-selection/-/rectangular-selection-0.19.2.tgz#caa60114421b5c43244494c94203b65f666edb53" 169 + integrity sha512-AXK/p5eGwFJ9GJcLfntqN4dgY+XiIF7eHfXNQJX5HhQLSped2wJE6WuC1rMEaOlcpOqlb9mrNi/ZdUjSIj9mbA== 170 + dependencies: 171 + "@codemirror/state" "^0.19.0" 172 + "@codemirror/text" "^0.19.4" 173 + "@codemirror/view" "^0.19.48" 174 + 175 + "@codemirror/search@^0.19.0": 176 + version "0.19.9" 177 + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-0.19.9.tgz#b9548dfeb2028e6d5ecd1965f8f0ee50e2925603" 178 + integrity sha512-h3MuwbUbiyOp6Np3IB5r4LH0w4inZvbtLO1Ipmz8RhElcGRiYr11Q6Bim8ocLfe08RmZT6B5EkTj1E8eNlugQQ== 179 + dependencies: 180 + "@codemirror/panel" "^0.19.0" 181 + "@codemirror/rangeset" "^0.19.0" 182 + "@codemirror/state" "^0.19.3" 183 + "@codemirror/text" "^0.19.0" 184 + "@codemirror/view" "^0.19.34" 185 + crelt "^1.0.5" 186 + 187 + "@codemirror/state@^0.19.0", "@codemirror/state@^0.19.2", "@codemirror/state@^0.19.3", "@codemirror/state@^0.19.4", "@codemirror/state@^0.19.9": 188 + version "0.19.9" 189 + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-0.19.9.tgz#b797f9fbc204d6dc7975485e231693c09001b0dd" 190 + integrity sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw== 191 + dependencies: 192 + "@codemirror/text" "^0.19.0" 193 + 194 + "@codemirror/stream-parser@^0.19.0": 195 + version "0.19.9" 196 + resolved "https://registry.yarnpkg.com/@codemirror/stream-parser/-/stream-parser-0.19.9.tgz#34955ea91a8047cf72abebd5ce28f0d332aeca48" 197 + integrity sha512-WTmkEFSRCetpk8xIOvV2yyXdZs3DgYckM0IP7eFi4ewlxWnJO/H4BeJZLs4wQaydWsAqTQoDyIwNH1BCzK5LUQ== 198 + dependencies: 199 + "@codemirror/highlight" "^0.19.0" 200 + "@codemirror/language" "^0.19.0" 201 + "@codemirror/state" "^0.19.0" 202 + "@codemirror/text" "^0.19.0" 203 + "@lezer/common" "^0.15.0" 204 + "@lezer/lr" "^0.15.0" 205 + 206 + "@codemirror/text@^0.19.0", "@codemirror/text@^0.19.2", "@codemirror/text@^0.19.4", "@codemirror/text@^0.19.6": 207 + version "0.19.6" 208 + resolved "https://registry.yarnpkg.com/@codemirror/text/-/text-0.19.6.tgz#9adcbd8137f69b75518eacd30ddb16fd67bbac45" 209 + integrity sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA== 210 + 211 + "@codemirror/tooltip@^0.19.12", "@codemirror/tooltip@^0.19.16": 212 + version "0.19.16" 213 + resolved "https://registry.yarnpkg.com/@codemirror/tooltip/-/tooltip-0.19.16.tgz#6ba2c43f9d8e3d943d9d7bbae22bf800f7726a22" 214 + integrity sha512-zxKDHryUV5/RS45AQL+wOeN+i7/l81wK56OMnUPoTSzCWNITfxHn7BToDsjtrRKbzHqUxKYmBnn/4hPjpZ4WJQ== 215 + dependencies: 216 + "@codemirror/state" "^0.19.0" 217 + "@codemirror/view" "^0.19.0" 218 + 219 + "@codemirror/view@^0.19.0", "@codemirror/view@^0.19.22", "@codemirror/view@^0.19.23", "@codemirror/view@^0.19.31", "@codemirror/view@^0.19.34", "@codemirror/view@^0.19.39", "@codemirror/view@^0.19.44", "@codemirror/view@^0.19.48": 220 + version "0.19.48" 221 + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.19.48.tgz#1c657e2b0f8ed896ac6448d6e2215ab115e2a0fc" 222 + integrity sha512-0eg7D2Nz4S8/caetCTz61rK0tkHI17V/d15Jy0kLOT8dTLGGNJUponDnW28h2B6bERmPlVHKh8MJIr5OCp1nGw== 223 + dependencies: 224 + "@codemirror/rangeset" "^0.19.5" 225 + "@codemirror/state" "^0.19.3" 226 + "@codemirror/text" "^0.19.0" 227 + style-mod "^4.0.0" 228 + w3c-keyname "^2.2.4" 229 + 230 + "@lezer/common@^0.15.0", "@lezer/common@^0.15.5": 231 + version "0.15.12" 232 + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-0.15.12.tgz#2f21aec551dd5fd7d24eb069f90f54d5bc6ee5e9" 233 + integrity sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig== 234 + 235 + "@lezer/lr@^0.15.0": 236 + version "0.15.8" 237 + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-0.15.8.tgz#1564a911e62b0a0f75ca63794a6aa8c5dc63db21" 238 + integrity sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg== 239 + dependencies: 240 + "@lezer/common" "^0.15.0" 241 + 242 + crelt@^1.0.5: 243 + version "1.0.5" 244 + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" 245 + integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== 246 + 247 + esbuild-android-64@0.14.30: 248 + version "0.14.30" 249 + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.30.tgz#9efcdb3d826b9c67705a0c518d361ab44ae4cc5b" 250 + integrity sha512-vdJ7t8A8msPfKpYUGUV/KaTQRiZ0vDa2XSTlzXVkGGVHLKPeb85PBUtYJcEgw3htW3IdX5i1t1IMdQCwJJgNAg== 251 + 252 + esbuild-android-arm64@0.14.30: 253 + version "0.14.30" 254 + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.30.tgz#7b90fa7578b94da047e0bf3da477cb5775b58664" 255 + integrity sha512-BdgGfxeA5hBQNErLr7BWJUA8xjflEfyaARICy8e0OJYNSAwDbEzOf8LyiKWSrDcgV129mWhi3VpbNQvOIDEHcg== 256 + 257 + esbuild-darwin-64@0.14.30: 258 + version "0.14.30" 259 + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.30.tgz#275e40eb100286b868d4cd664e6447b53400f7ff" 260 + integrity sha512-VRaOXMMrsG5n53pl4qFZQdXy2+E0NoLP/QH3aDUI0+bQP+ZHDmbINKcDy2IX7GVFI9kqPS18iJNAs5a6/G2LZg== 261 + 262 + esbuild-darwin-arm64@0.14.30: 263 + version "0.14.30" 264 + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.30.tgz#c2b8fe03fb0dcee1d227b226c9c921de71e4d411" 265 + integrity sha512-qDez+fHMOrO9Oc9qjt/x+sy09RJVh62kik5tVybKRLmezeV4qczM9/sAYY57YN0aWLdHbcCj2YqJUWYJNsgKnw== 266 + 267 + esbuild-freebsd-64@0.14.30: 268 + version "0.14.30" 269 + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.30.tgz#328bb272ce6cfcae202b6e0a06c240036335cc91" 270 + integrity sha512-mec1jENcImVVagddZlGWsdAUwBnzR5cgnhzCxv+9fSMxKbx1uZYLLUAnLPp8m/i934zrumR1xGjJ5VoWdPlI2w== 271 + 272 + esbuild-freebsd-arm64@0.14.30: 273 + version "0.14.30" 274 + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.30.tgz#49ce79fa7d7087a941e27432da46bafb5b35a979" 275 + integrity sha512-cpjbTs6Iok/AfeB0JgTzyUJTMStC1SQULmany5nHx6S4GTkSgaAHuJzZO0GcVWqghI4e0YL/bjXAhN5Mn6feNw== 276 + 277 + esbuild-linux-32@0.14.30: 278 + version "0.14.30" 279 + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.30.tgz#c473299f5291130f6d4436808603b529ccbfa785" 280 + integrity sha512-liIONVT4F2kZmOMwtwASqZ8WkIjb5HHBR9HUffdHiuotSTF3CyZO+EJf+Og+SYYuuVIvt0qHNSFjBA/iSESteQ== 281 + 282 + esbuild-linux-64@0.14.30: 283 + version "0.14.30" 284 + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.30.tgz#b4be59f0665a44574a7617c9db673943da6061f8" 285 + integrity sha512-LUnpzoMpRqFON5En4qEj6NWiyH6a1K+Y2qYNKrCy5qPTjDoG/EWeqMz69n8Uv7pRuvDKl3FNGJ1dufTrA5i0sw== 286 + 287 + esbuild-linux-arm64@0.14.30: 288 + version "0.14.30" 289 + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.30.tgz#78485a9f49858ea69ced85c3dd0fe58d354f20f8" 290 + integrity sha512-DHZHn6FK5q/KL0fpNT/0jE38Nnyk2rXxKE9WENi95EXtqfOLPgE8tzjTZQNgpr61R95QX4ymQU26ni3IZk8buQ== 291 + 292 + esbuild-linux-arm@0.14.30: 293 + version "0.14.30" 294 + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.30.tgz#00392bbe04ac687dd6d9849ecee302bc27f984f2" 295 + integrity sha512-97T+bbXnpqf7mfIG49UR7ZSJFGgvc22byn74qw3Kx2GDCBSQoVFjyWuKOHGXp8nXk3XYrdFF+mQ8yQ7aNsgQvg== 296 + 297 + esbuild-linux-mips64le@0.14.30: 298 + version "0.14.30" 299 + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.30.tgz#cf48a292037c3a9ca3ca84ec0ae4f47bf1247ab4" 300 + integrity sha512-fLUzTFZ7uknC0aPTk7/lM7NmaG/9ZqE3SaHEphcaM009SZK/mDOvZugWi1ss6WGNhk13dUrhkfHcc4FSb9hYhg== 301 + 302 + esbuild-linux-ppc64le@0.14.30: 303 + version "0.14.30" 304 + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.30.tgz#8e448a54e7040829ee9ecfc68dab0f3a039b1cff" 305 + integrity sha512-2Oudm2WEfj0dNU9bzIl5L/LrsMEmHWsOsYgJJqu8fDyUDgER+J1d33qz3cUdjsJk7gAENayIxDSpsuCszx0w3A== 306 + 307 + esbuild-linux-riscv64@0.14.30: 308 + version "0.14.30" 309 + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.30.tgz#118af007f21adb00c4362d5eda3f004290f4d0ef" 310 + integrity sha512-RPMucPW47rV4t2jlelaE948iCRtbZf5RhifxSwzlpM1Mqdyu99MMNK0w4jFreGTmLN+oGomxIOxD6n+2E/XqHw== 311 + 312 + esbuild-linux-s390x@0.14.30: 313 + version "0.14.30" 314 + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.30.tgz#e0649e26d8791bf6265685842dcef732de59b49b" 315 + integrity sha512-OZ68r7ok6qO7hdwrwQn2p5jbIRRcUcVaAykB7e0uCA0ODwfeGunILM6phJtq2Oz4dlEEFvd+tSuma3paQKwt+A== 316 + 317 + esbuild-netbsd-64@0.14.30: 318 + version "0.14.30" 319 + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.30.tgz#7653db21ab4379a1b557f338b040e3493ff5006c" 320 + integrity sha512-iyejQUKn0TzpPkufq8pSCxOg9NheycQbMbPCmjefTe9wYuUlBt1TcHvdoJnYbQzsAhAh1BNq+s0ycRsIJFZzaQ== 321 + 322 + esbuild-openbsd-64@0.14.30: 323 + version "0.14.30" 324 + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.30.tgz#3fad1699cb2ca7a060585356e2881df7b3fa5bb1" 325 + integrity sha512-UyK1MTMcy4j5fH260fsE1o6MVgWNhb62eCK2yCKCRazZv8Nqdc2WiP9ygjWidmEdCDS+A6MuVp9ozk9uoQtQpA== 326 + 327 + esbuild-sunos-64@0.14.30: 328 + version "0.14.30" 329 + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.30.tgz#2306a178dc2362cf32fc182327c21b49b78ca1a3" 330 + integrity sha512-aQRtRTNKHB4YuG+xXATe5AoRTNY48IJg5vjE8ElxfmjO9+KdX7MHFkTLhlKevCD6rNANtB3qOlSIeAiXTwHNqw== 331 + 332 + esbuild-windows-32@0.14.30: 333 + version "0.14.30" 334 + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.30.tgz#ea17b2a9468e346734f926a7edd49de3cc81d12f" 335 + integrity sha512-9/fb1tPtpacMqxAXp3fGHowUDg/l9dVch5hKmCLEZC6PdGljh6h372zMdJwYfH0Bd5CCPT0Wx95uycBLJiqpXA== 336 + 337 + esbuild-windows-64@0.14.30: 338 + version "0.14.30" 339 + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.30.tgz#266147f1f45974ac61dece10ab32bc916050dcc2" 340 + integrity sha512-DHgITeUhPAnN9I5O6QBa1GVyPOhiYCn4S4TtQr7sO4+X0LNyqnlmA1M0qmGkUdDC1QQfjI8uQ4G/whdWb2pWIQ== 341 + 342 + esbuild-windows-arm64@0.14.30: 343 + version "0.14.30" 344 + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.30.tgz#8e5e9c2455bffaf3e1a387eee4841f5c3797b8a8" 345 + integrity sha512-F1kLyQH7zSgjh5eLxogGZN7C9+KNs9m+s7Q6WZoMmCWT/6j998zlaoECHyM8izJRRfsvw2eZlEa1jO6/IOU1AQ== 346 + 347 + esbuild@^0.14.29: 348 + version "0.14.30" 349 + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.30.tgz#8bf6501a58f71e622e7485aeada79c764c1affe4" 350 + integrity sha512-wCecQSBkIjp2xjuXY+wcXS/PpOQo9rFh4NAKPh4Pm9f3fuLcnxkR0rDzA+mYP88FtXIUcXUyYmaIgfrzRl55jA== 351 + optionalDependencies: 352 + esbuild-android-64 "0.14.30" 353 + esbuild-android-arm64 "0.14.30" 354 + esbuild-darwin-64 "0.14.30" 355 + esbuild-darwin-arm64 "0.14.30" 356 + esbuild-freebsd-64 "0.14.30" 357 + esbuild-freebsd-arm64 "0.14.30" 358 + esbuild-linux-32 "0.14.30" 359 + esbuild-linux-64 "0.14.30" 360 + esbuild-linux-arm "0.14.30" 361 + esbuild-linux-arm64 "0.14.30" 362 + esbuild-linux-mips64le "0.14.30" 363 + esbuild-linux-ppc64le "0.14.30" 364 + esbuild-linux-riscv64 "0.14.30" 365 + esbuild-linux-s390x "0.14.30" 366 + esbuild-netbsd-64 "0.14.30" 367 + esbuild-openbsd-64 "0.14.30" 368 + esbuild-sunos-64 "0.14.30" 369 + esbuild-windows-32 "0.14.30" 370 + esbuild-windows-64 "0.14.30" 371 + esbuild-windows-arm64 "0.14.30" 372 + 373 + style-mod@^4.0.0: 374 + version "4.0.0" 375 + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.0.tgz#97e7c2d68b592975f2ca7a63d0dd6fcacfe35a01" 376 + integrity sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw== 377 + 378 + w3c-keyname@^2.2.4: 379 + version "2.2.4" 380 + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.4.tgz#4ade6916f6290224cdbd1db8ac49eab03d0eef6b" 381 + integrity sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw==