├── .github └── workflows │ └── pipeline.yml ├── .gitignore ├── Changelog.md ├── LICENSE ├── README.md ├── artwork └── eastwood-page-under-construction.png ├── bin ├── Bin.re └── dune ├── copyPlatformBinaryInPlace.js ├── dune-project ├── dune-workspace ├── esy.json ├── esy.lock ├── .gitattributes ├── .gitignore ├── index.json ├── opam │ ├── atd.2.0.0 │ │ └── opam │ ├── atdgen-runtime.2.0.0 │ │ └── opam │ ├── atdgen.2.0.0 │ │ └── opam │ ├── base-threads.base │ │ └── opam │ ├── base-unix.base │ │ └── opam │ ├── biniou.1.2.1 │ │ └── opam │ ├── conf-m4.1 │ │ └── opam │ ├── cppo.1.6.6 │ │ └── opam │ ├── dune.1.11.4 │ │ └── opam │ ├── easy-format.1.3.2 │ │ └── opam │ ├── jbuilder.transition │ │ └── opam │ ├── menhir.20190924 │ │ └── opam │ ├── merlin-extend.0.5 │ │ └── opam │ ├── merlin.3.3.3 │ │ └── opam │ ├── ocaml-migrate-parsetree.1.5.0 │ │ └── opam │ ├── ocamlbuild.0.14.0 │ │ └── opam │ ├── ocamlfind.1.8.1 │ │ ├── files │ │ │ ├── ocaml-stub │ │ │ └── ocamlfind.install │ │ └── opam │ ├── ppx_derivers.1.2.1 │ │ └── opam │ ├── re.1.9.0 │ │ └── opam │ ├── result.1.4 │ │ └── opam │ ├── seq.0.2.2 │ │ └── opam │ └── yojson.1.7.0 │ │ └── opam └── overrides │ ├── opam__s__ocamlbuild_opam__c__0.14.0_opam_override │ ├── files │ │ └── ocamlbuild-0.14.0.patch │ └── package.json │ └── opam__s__ocamlfind_opam__c__1.8.1_opam_override │ ├── files │ └── findlib-1.8.1.patch │ └── package.json ├── example ├── .gitignore ├── bsconfig.json ├── package.json └── src │ └── Index.re ├── let_anything_ppx.opam ├── package.json └── src ├── Let_anything.re └── dune /.github/workflows/pipeline.yml: -------------------------------------------------------------------------------- 1 | name: bs-let pipeline 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | test_and_build_linux: 7 | name: ${{ matrix.os }} / node-${{ matrix.node-version }} 8 | runs-on: ${{ matrix.os }} 9 | strategy: 10 | matrix: 11 | node-version: [12.x] 12 | os: [ubuntu-latest] 13 | 14 | container: 15 | # https://github.com/baransu/docker-esy 16 | image: cichocinski/docker-esy:alpine3.8 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Use Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v1 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | 25 | - name: Get esy store path 26 | id: esy_cache_path 27 | shell: bash 28 | run: | 29 | # COMPUTE THE ESY INSTALL CACHE LOCATION AHEAD OF TIME 30 | DESIRED_LEN="86" 31 | HOME_ESY3="$HOME/.esy/3" 32 | HOME_ESY3_LEN=${#HOME_ESY3} 33 | NUM_UNDERS=$(echo "$(($DESIRED_LEN-$HOME_ESY3_LEN))") 34 | UNDERS=$(printf "%-${NUM_UNDERS}s" "_") 35 | UNDERS="${UNDERS// /_}" 36 | THE_ESY__CACHE_INSTALL_PATH=${HOME_ESY3}${UNDERS}/i 37 | echo "THE_ESY__CACHE_INSTALL_PATH: $THE_ESY__CACHE_INSTALL_PATH" 38 | echo "##[set-output name=path;]$THE_ESY__CACHE_INSTALL_PATH" 39 | - name: Restore esy cache 40 | uses: actions/cache@v2 41 | with: 42 | path: ${{ steps.esy_cache_path.outputs.path }} 43 | key: v1-esy-${{ matrix.os }}-${{ hashFiles('**/index.json') }} 44 | restore-keys: | 45 | v1-esy-${{ matrix.os }}- 46 | 47 | - name: Install and build 48 | run: | 49 | esy install 50 | esy dune build --root . --only-packages '#{self.name}' --ignore-promoted-rules --no-config --profile release-static 51 | - name: (only on release) Upload artifacts ${{ matrix.os }} 52 | if: github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') 53 | uses: actions/upload-artifact@master 54 | with: 55 | name: ${{ matrix.os }} 56 | path: _build/default/bin/bin.exe 57 | 58 | test_and_build: 59 | name: ${{ matrix.os }} / node-${{ matrix.node-version }} 60 | runs-on: ${{ matrix.os }} 61 | strategy: 62 | matrix: 63 | node-version: [12.x] 64 | os: [windows-latest, macOS-latest] 65 | 66 | steps: 67 | - uses: actions/checkout@v2 68 | - name: Use Node.js ${{ matrix.node-version }} 69 | uses: actions/setup-node@v1 70 | with: 71 | node-version: ${{ matrix.node-version }} 72 | - name: Install esy 73 | run: | 74 | npm install -g esy@latest 75 | 76 | - name: Get esy store path 77 | id: esy_cache_path 78 | shell: bash 79 | run: | 80 | # COMPUTE THE ESY INSTALL CACHE LOCATION AHEAD OF TIME 81 | if [ "${{ matrix.os }}" == "windows-latest" ]; then 82 | THE_ESY__CACHE_INSTALL_PATH=$HOME/.esy/3_/i 83 | THE_ESY__CACHE_INSTALL_PATH=$( cygpath --mixed --absolute "$THE_ESY__CACHE_INSTALL_PATH") 84 | else 85 | DESIRED_LEN="86" 86 | HOME_ESY3="$HOME/.esy/3" 87 | HOME_ESY3_LEN=${#HOME_ESY3} 88 | NUM_UNDERS=$(echo "$(($DESIRED_LEN-$HOME_ESY3_LEN))") 89 | UNDERS=$(printf "%-${NUM_UNDERS}s" "_") 90 | UNDERS="${UNDERS// /_}" 91 | THE_ESY__CACHE_INSTALL_PATH=${HOME_ESY3}${UNDERS}/i 92 | fi 93 | echo "THE_ESY__CACHE_INSTALL_PATH: $THE_ESY__CACHE_INSTALL_PATH" 94 | echo "##[set-output name=path;]$THE_ESY__CACHE_INSTALL_PATH" 95 | - name: Restore esy cache 96 | uses: actions/cache@v2 97 | with: 98 | path: ${{ steps.esy_cache_path.outputs.path }} 99 | key: v1-esy-${{ matrix.os }}-${{ hashFiles('**/index.json') }} 100 | restore-keys: | 101 | v1-esy-${{ matrix.os }}- 102 | 103 | - name: Install and build 104 | run: | 105 | esy install 106 | esy b 107 | - name: (only on release) Upload artifacts ${{ matrix.os }} 108 | if: github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') 109 | uses: actions/upload-artifact@master 110 | with: 111 | name: ${{ matrix.os }} 112 | path: _build/default/bin/bin.exe 113 | 114 | publish: 115 | needs: test_and_build 116 | if: github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') 117 | name: (only on release) Publish 118 | runs-on: ubuntu-latest 119 | steps: 120 | - uses: actions/checkout@v2 121 | - uses: actions/setup-node@v1 122 | with: 123 | node-version: "12.x" 124 | registry-url: "https://registry.npmjs.org" 125 | 126 | - name: Download linux artifacts 127 | if: success() 128 | uses: actions/download-artifact@master 129 | with: 130 | name: ubuntu-latest 131 | path: binaries/linux 132 | 133 | - name: Download macOS artifacts 134 | if: success() 135 | uses: actions/download-artifact@master 136 | with: 137 | name: macOS-latest 138 | path: binaries/darwin 139 | 140 | - name: Download windows artifacts 141 | if: success() 142 | uses: actions/download-artifact@master 143 | with: 144 | name: windows-latest 145 | path: binaries/windows 146 | 147 | - name: Move artifacts 148 | if: success() 149 | run: | 150 | mkdir -p release 151 | mv binaries/darwin/bin.exe release/bs-let-darwin-x64.exe 152 | mv binaries/windows/bin.exe release/bs-let-win-x64.exe 153 | mv binaries/linux/bin.exe release/bs-let-linux-x64.exe 154 | mv package.json release/package.json 155 | mv copyPlatformBinaryInPlace.js release/copyPlatformBinaryInPlace.js 156 | ls -l release 157 | 158 | - name: Publish 159 | working-directory: release 160 | if: success() 161 | run: npm publish --access public 162 | env: 163 | NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} 164 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _esy 2 | .merlin 3 | node_modules 4 | _build 5 | _release 6 | *.byte 7 | *.native 8 | *.install 9 | -------------------------------------------------------------------------------- /Changelog.md: -------------------------------------------------------------------------------- 1 | # 0.1.16 2 | 3 | - Sorry for the mess, but the last couple of changes broke the PPX entirely, at least for non-Windows people. This change renames the executable from `ppx.exe` to just `ppx` like it was before. 4 | - Hey Windows people, does this break you? Please let us know. 5 | 6 | # 0.1.15 7 | 8 | - Fixed Windows support thanks to @bikallem! 9 | 10 | # 0.1.14 11 | 12 | - Changed the build process to support windows and use Github Actions (thank you @baransu)! 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Javier Chávarri 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bs-let 2 | 3 | ![A woman knitting some code](https://github.com/reasonml-labs/bs-let/raw/master/artwork/eastwood-page-under-construction.png) 4 | 5 | This is a PPX (language extension) designed to make _monadic operations_ (think async functions with "await" statements in Javascript if you don't know what a monadic operation is) easy to write and read in ReasonML. 6 | 7 | ## Warning: Experimental Project 8 | 9 | This is package is an experimental community project (a.k.a "labs"). This means that community members use it and contribute to it, but it is not officially supported or recommended by the ReasonML community. Using this project in a production environment means being willing to contribute yourself if needs be. 10 | 11 | Also, the expected lifetime of this PPX is relatively short. OCaml 4.08 has introduced native syntax for doing the same thing that this PPX does (`let+`). At the time of this writing, Bucklescript is still a ways out from supporting OCaml 4.08, or backporting support for `let+`. This PPX has two purposes: 12 | 13 | - Provide a temporary solution until Bucklescript and Reason both support `let+`. 14 | - Gauge community interest in monadic syntax sugar in general and gather feedback on its usage. 15 | 16 | ## Compatibility 17 | 18 | This package only works with bs-platform 6.x and above. If you're stuck on 5.x take a look at [Jared's original repo](https://github.com/jaredly/let-anything). 19 | 20 | ## Installation 21 | 22 | - `npm install --save-dev bs-let` 23 | - Open up your `bsconfig.json` and add `bs-let/ppx` to your `ppx-flags`. It should look something like this: 24 | 25 | ```json 26 | { 27 | "ppx-flags": ["bs-let/ppx"] 28 | } 29 | ``` 30 | 31 | ## Usage 32 | 33 | Simple and sweet, this is a language extension that flattens callbacks. 34 | 35 | If you'd like to see it in action, take a look at the video below. Otherwise, keep reading! 36 | 37 | [![Screenshot of instructional video from egghead.io](https://user-images.githubusercontent.com/1227109/70068564-76825580-15ad-11ea-8d4a-f2161bbd40f3.png)](https://egghead.io/lessons/reason-async-await-in-reasonml) 38 | 39 | All you need is a module which defines a function called `let_` which takes something to map over, and a callback to do the mapping. For example: 40 | 41 | ```reason 42 | module Option = { 43 | let let_ = Belt.Option.flatMap; 44 | }; 45 | ``` 46 | 47 | Then, when you're working with something you want to map, add a `%` onto your `let`, and the rest of the lines in the block will be turned into a callback and passed to the mapping function _at compile time_. 48 | 49 | For example: 50 | 51 | ```reason 52 | // Assume the `Option` module from above is defined already. 53 | 54 | type address = {street: option(string)}; 55 | 56 | type personalInfo = {address: option(address)}; 57 | 58 | type user = {info: option(personalInfo)}; 59 | 60 | // Get the user's street name from a bunch of nested options. If anything is 61 | // None, return None. 62 | let getStreet = (maybeUser: option(user)): option(string) => { 63 | let%Option user = maybeUser; 64 | // Notice that info isn't an option anymore once we use let%Option! 65 | let%Option info = user.info; 66 | let%Option address = info.address; 67 | let%Option street = address.street; 68 | Some(street->Js.String.toUpperCase); 69 | }; 70 | ``` 71 | 72 | That code is flat, readable, and understandable. Here's an alternative without the syntax sugar: 73 | 74 | ```reason 75 | let getStreet = (maybeUser: option(user)): option(string) => { 76 | maybeUser->Belt.Option.flatMap(user => 77 | user.info 78 | ->Belt.Option.flatMap(personalInfo => 79 | personalInfo.address 80 | ->Belt.Option.flatMap(address => 81 | address.street 82 | ->Belt.Option.flatMap(street => 83 | Some(street->Js.String.toUpperCase) 84 | ) 85 | ) 86 | ) 87 | ); 88 | }; 89 | ``` 90 | 91 | Much nicer to have the sugar, no? This PPX really shines, though, when we use it to chain async operations, since that has to be done quite a lot in Javascript, especially server-side, and it typically happens multiple times in the middle of large and complex functions. 92 | 93 | Here's a more complex example of an async control flow using the [reason-promise](https://github.com/aantron/promise) library to work with Javascript promises: 94 | 95 | ```reason 96 | // reason-promise doesn't ship with native support for this PPX, so we simply 97 | // add our own by re-defining the module, including all the stuff from the 98 | // original module, and adding our own function. 99 | module Promise = { 100 | include Promise; 101 | let let_ = Promise.flatMap; 102 | 103 | // This is totally optional. It can be nice sometimes to return a 104 | // non-promise value at the end of a function and have it automatically 105 | // wrapped. See example inside the Some branch of the switch below. 106 | module Wrap = { 107 | let let_ = Promise.map; 108 | }; 109 | }; 110 | 111 | let logUserIn = (email: string, password: string) => { 112 | // Assume this is a function that returns a promise of a hash. 113 | let%Promise hash = UserService.hashPassword(password); 114 | let%Promise maybeUser = UserService.findUserForEmailAndHash(email, hash); 115 | let result = 116 | switch (maybeUser) { 117 | | Some(user) => 118 | // It even works inside of a switch expression! 119 | // Here you can see we're using ".Wrap" to automatically wrap our result 120 | // in a promise. 121 | let%Promise.Wrap apiToken = TokenService.generateForUser(user.id); 122 | Ok(user.firstName, apiToken); 123 | | None => 124 | // We resolve a promise here to match the branch above. 125 | Error("Sorry, no user found for that email & password combination") 126 | ->Promise.resolved 127 | }; 128 | 129 | // Since let_ is defined as "flatMap" we've got to remember to return a promise 130 | // at the end of the function! Remember, all the lines after each let% just get 131 | // turned into a callback! 132 | Promise.resolved(result); 133 | }; 134 | ``` 135 | 136 | There's a whole lot that can be done with this PPX. It's even possible to go a little crazy and start writing modules that combine monads, like `AsyncOption` that will specifically handle optional values inside of promises. But, in practice, those modules are seldom needed. Don't go too crazy, keeping it simple will get you a long, long way. 137 | 138 | Things to remember: 139 | 140 | - You don't have to name your module anything special. It could be named `Foo` and you can `let%Foo blah = ...`. 141 | - Simple is better than complex. 142 | - Obvious is usually better than hidden. 143 | 144 | ## About Performance 145 | 146 | It's worth noting that this PPX simply produces a _function callback structure_. Why is this important? There are potential performance gains in situations where avoiding a callback structure is possible. 147 | 148 | For example, this handrwitten code, which is pretty much what the PPX produces: 149 | 150 | ```reason 151 | let getStreet = (maybeUser: option(user)): option(string) => { 152 | maybeUser->Belt.Option.flatMap(user => 153 | user.info 154 | ->Belt.Option.flatMap(personalInfo => 155 | personalInfo.address 156 | ->Belt.Option.flatMap(address => 157 | address.street 158 | ->Belt.Option.flatMap(street => 159 | Some(street->Js.String.toUpperCase) 160 | ) 161 | ) 162 | ) 163 | ); 164 | }; 165 | ``` 166 | 167 | Is _functionally_ equivalent, but inferior in terms of performance, to the following hand-written code: 168 | 169 | ```reason 170 | let getStreetExplicit = (maybeUser: option(user)): option(string) => { 171 | switch (maybeUser) { 172 | | None => None 173 | | Some(user) => 174 | switch (user.info) { 175 | | None => None 176 | | Some(personalInfo) => 177 | switch (personalInfo.address) { 178 | | None => None 179 | | Some(address) => 180 | switch (address.street) { 181 | | None => None 182 | | Some(street) => Some(street->Js.String.toUpperCase) 183 | } 184 | } 185 | } 186 | }; 187 | }; 188 | ``` 189 | 190 | Because we're working with Options, we can `switch` on the values instead of `flatMap`-ing. The generated Javascript of the second approach looks like this: 191 | 192 | ```javascript 193 | function getStreetExplicit(maybeUser) { 194 | if (maybeUser !== undefined) { 195 | var match = maybeUser[/* info */ 0]; 196 | if (match !== undefined) { 197 | var match$1 = match[/* address */ 0]; 198 | if (match$1 !== undefined) { 199 | var match$2 = match$1[/* street */ 0]; 200 | if (match$2 !== undefined) { 201 | return match$2.toUpperCase(); 202 | } else { 203 | return; 204 | } 205 | } else { 206 | return; 207 | } 208 | } else { 209 | return; 210 | } 211 | } 212 | } 213 | ``` 214 | 215 | Only one total function invocation is produced by the compiler in this case instead of one invocation _for every bind_. This is significantly faster to execute and may be worth choosing if this function will be very highly trafficked. 216 | 217 | In summary, this PPX is not designed to produce the most performant code in every case. It's just designed to make callbacks easier to use. 218 | 219 | ## Notes 220 | 221 | **A Note about Native VS Bucklescript** 222 | This is specifically designed to be helpful with writing Javascript code through ReasonML and Bucklescript. Native OCaml 4.08 implemented a native monadic sugar syntax. So if you're writing native code, I'd suggest skipping this PPX and waiting until [this PR](https://github.com/facebook/reason/pull/2487) lands in Reason, and then adopting the new syntax. 223 | 224 | **A Note about Windows** 225 | Currently this project only precomiles binaries for linux and OS X according to the needs of existing maintainers. If you're a Windows user and would like to use this PPX, We'd love a pull-request that moves the project from Travis to Azure Pipelines and builds for all three platforms. 226 | 227 | ## Credit 228 | 229 | This PPX was created by @jaredly and upgraded to the latest OCaml by @anmonteiro. Murphy Randle has merged Antonio's changes to upgrade the package for Bucklescript 6.x and 7.x, re-packaged it to build with `esy` and precompiled binaries for osx and linux. Murphy has also written this readme to describe the most common use-case for this PPX. More features are available but undocumented in this readme. You can see them here: https://github.com/jaredly/let-anything. 230 | 231 | - Lovely readme artwork https://icons8.com/ouch/illustration/eastwood-page-under-construction 232 | -------------------------------------------------------------------------------- /artwork/eastwood-page-under-construction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rescript-labs/bs-let/HEAD/artwork/eastwood-page-under-construction.png -------------------------------------------------------------------------------- /bin/Bin.re: -------------------------------------------------------------------------------- 1 | open Migrate_parsetree; 2 | open Let_anything_lib; 3 | 4 | let _ = Driver.run_as_ppx_rewriter(); 5 | -------------------------------------------------------------------------------- /bin/dune: -------------------------------------------------------------------------------- 1 | (executable 2 | (name bin) 3 | (public_name let_anything_ppx) 4 | (libraries let_anything_lib) 5 | (ocamlopt_flags ( -linkall ))) 6 | -------------------------------------------------------------------------------- /copyPlatformBinaryInPlace.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var fs = require("fs"); 4 | var path = require("path"); 5 | 6 | var arch = process.arch === "ia32" ? "x86" : process.arch; 7 | var platform = process.platform === "win32" ? "win" : process.platform; 8 | 9 | var rootDir = __dirname; 10 | var sourceExePath = path.join(rootDir, `bs-let-${platform}-${arch}.exe`); 11 | var destExePath = path.join(rootDir, `ppx${platform == "win" ? : ".exe": ""}`); 12 | 13 | copyBinary(sourceExePath, destExePath); 14 | 15 | function copyBinary(sourceFilename, destFilename) { 16 | var supported = fs.existsSync(sourceFilename); 17 | 18 | if (!supported) { 19 | console.error("bs-let does not support this platform :("); 20 | console.error(""); 21 | console.error("bs-let comes prepacked as built binaries to avoid large"); 22 | console.error("dependencies at build-time."); 23 | console.error(""); 24 | console.error("If you want bs-let to support this platform natively,"); 25 | console.error( 26 | "please open an issue at our repository, linked above. Please" 27 | ); 28 | console.error("specify that you are on the " + platform + " platform,"); 29 | console.error("on the " + arch + " architecture."); 30 | } 31 | 32 | if (!fs.existsSync(destFilename)) { 33 | copyFileSync(sourceFilename, destFilename); 34 | fs.chmodSync(destFilename, 0755); 35 | } 36 | } 37 | 38 | function copyFileSync(source, dest) { 39 | if (typeof fs.copyFileSync === "function") { 40 | fs.copyFileSync(source, dest); 41 | } else { 42 | fs.writeFileSync(dest, fs.readFileSync(source)); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /dune-project: -------------------------------------------------------------------------------- 1 | (lang dune 1.0) 2 | 3 | (name "let_anything_ppx") 4 | -------------------------------------------------------------------------------- /dune-workspace: -------------------------------------------------------------------------------- 1 | (lang dune 1.1) 2 | 3 | (env (release-static (flags (:standard -ccopt -static)))) 4 | -------------------------------------------------------------------------------- /esy.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "let_anything_ppx", 3 | "devDependencies": { 4 | "@opam/dune": "*", 5 | "@opam/merlin": "3.3.3", 6 | "@opam/ocaml-migrate-parsetree": "1.5.0", 7 | "ocaml": "4.06.1000", 8 | "refmterr": "3.3.0", 9 | "@esy-ocaml/reason": "~3.5.0" 10 | }, 11 | "esy": { 12 | "build": [["dune", "build", "-p", "#{self.name}"]], 13 | "buildsInSource": "_build" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /esy.lock/.gitattributes: -------------------------------------------------------------------------------- 1 | 2 | # Set eol to LF so files aren't converted to CRLF-eol on Windows. 3 | * text eol=lf 4 | -------------------------------------------------------------------------------- /esy.lock/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Reset any possible .gitignore, we want all esy.lock to be un-ignored. 3 | !* 4 | -------------------------------------------------------------------------------- /esy.lock/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "checksum": "a4e6d53d0fe75957e5a762da5eb64354", 3 | "root": "let_anything_ppx@link-dev:./esy.json", 4 | "node": { 5 | "refmterr@3.3.0@d41d8cd9": { 6 | "id": "refmterr@3.3.0@d41d8cd9", 7 | "name": "refmterr", 8 | "version": "3.3.0", 9 | "source": { 10 | "type": "install", 11 | "source": [ 12 | "archive:https://registry.npmjs.org/refmterr/-/refmterr-3.3.0.tgz#sha1:45adde80205093c201b491b3c37dd7740c9b036b" 13 | ] 14 | }, 15 | "overrides": [], 16 | "dependencies": [ 17 | "ocaml@4.6.1000@d41d8cd9", "@reason-native/pastel@0.2.3@d41d8cd9", 18 | "@reason-native/console@0.1.0@d41d8cd9", 19 | "@opam/re@opam:1.9.0@d4d5e13d", "@opam/dune@opam:1.11.4@a7ccb7ae", 20 | "@opam/atdgen@opam:2.0.0@46af0360", 21 | "@esy-ocaml/reason@3.5.2@d41d8cd9" 22 | ], 23 | "devDependencies": [] 24 | }, 25 | "ocaml@4.6.1000@d41d8cd9": { 26 | "id": "ocaml@4.6.1000@d41d8cd9", 27 | "name": "ocaml", 28 | "version": "4.6.1000", 29 | "source": { 30 | "type": "install", 31 | "source": [ 32 | "archive:https://registry.npmjs.org/ocaml/-/ocaml-4.6.1000.tgz#sha1:99525ef559353481396454f9a072dedc96b52f44" 33 | ] 34 | }, 35 | "overrides": [], 36 | "dependencies": [], 37 | "devDependencies": [] 38 | }, 39 | "let_anything_ppx@link-dev:./esy.json": { 40 | "id": "let_anything_ppx@link-dev:./esy.json", 41 | "name": "let_anything_ppx", 42 | "version": "link-dev:./esy.json", 43 | "source": { "type": "link-dev", "path": ".", "manifest": "esy.json" }, 44 | "overrides": [], 45 | "dependencies": [], 46 | "devDependencies": [ 47 | "refmterr@3.3.0@d41d8cd9", "ocaml@4.6.1000@d41d8cd9", 48 | "@opam/ocaml-migrate-parsetree@opam:1.5.0@3e319dbc", 49 | "@opam/merlin@opam:3.3.3@d653b06a", 50 | "@opam/dune@opam:1.11.4@a7ccb7ae", "@esy-ocaml/reason@3.5.2@d41d8cd9" 51 | ] 52 | }, 53 | "@reason-native/pastel@0.2.3@d41d8cd9": { 54 | "id": "@reason-native/pastel@0.2.3@d41d8cd9", 55 | "name": "@reason-native/pastel", 56 | "version": "0.2.3", 57 | "source": { 58 | "type": "install", 59 | "source": [ 60 | "archive:https://registry.npmjs.org/@reason-native/pastel/-/pastel-0.2.3.tgz#sha1:5c5d420c09874584ce15a38695c5dfd0f0ff5dfa" 61 | ] 62 | }, 63 | "overrides": [], 64 | "dependencies": [ 65 | "ocaml@4.6.1000@d41d8cd9", "@opam/re@opam:1.9.0@d4d5e13d", 66 | "@opam/dune@opam:1.11.4@a7ccb7ae", "@esy-ocaml/reason@3.5.2@d41d8cd9" 67 | ], 68 | "devDependencies": [] 69 | }, 70 | "@reason-native/console@0.1.0@d41d8cd9": { 71 | "id": "@reason-native/console@0.1.0@d41d8cd9", 72 | "name": "@reason-native/console", 73 | "version": "0.1.0", 74 | "source": { 75 | "type": "install", 76 | "source": [ 77 | "archive:https://registry.npmjs.org/@reason-native/console/-/console-0.1.0.tgz#sha1:3b56f0e9e1be8464329793df29020aa90e71c22c" 78 | ] 79 | }, 80 | "overrides": [], 81 | "dependencies": [ 82 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae", 83 | "@esy-ocaml/reason@3.5.2@d41d8cd9" 84 | ], 85 | "devDependencies": [] 86 | }, 87 | "@opam/yojson@opam:1.7.0@7056d985": { 88 | "id": "@opam/yojson@opam:1.7.0@7056d985", 89 | "name": "@opam/yojson", 90 | "version": "opam:1.7.0", 91 | "source": { 92 | "type": "install", 93 | "source": [ 94 | "archive:https://opam.ocaml.org/cache/md5/b8/b89d39ca3f8c532abe5f547ad3b8f84d#md5:b89d39ca3f8c532abe5f547ad3b8f84d", 95 | "archive:https://github.com/ocaml-community/yojson/releases/download/1.7.0/yojson-1.7.0.tbz#md5:b89d39ca3f8c532abe5f547ad3b8f84d" 96 | ], 97 | "opam": { 98 | "name": "yojson", 99 | "version": "1.7.0", 100 | "path": "esy.lock/opam/yojson.1.7.0" 101 | } 102 | }, 103 | "overrides": [], 104 | "dependencies": [ 105 | "ocaml@4.6.1000@d41d8cd9", "@opam/easy-format@opam:1.3.2@0484b3c4", 106 | "@opam/dune@opam:1.11.4@a7ccb7ae", "@opam/cppo@opam:1.6.6@f4f83858", 107 | "@opam/biniou@opam:1.2.1@d7570399", 108 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 109 | ], 110 | "devDependencies": [ 111 | "ocaml@4.6.1000@d41d8cd9", "@opam/easy-format@opam:1.3.2@0484b3c4", 112 | "@opam/dune@opam:1.11.4@a7ccb7ae", "@opam/biniou@opam:1.2.1@d7570399" 113 | ] 114 | }, 115 | "@opam/seq@opam:0.2.2@e9144e45": { 116 | "id": "@opam/seq@opam:0.2.2@e9144e45", 117 | "name": "@opam/seq", 118 | "version": "opam:0.2.2", 119 | "source": { 120 | "type": "install", 121 | "source": [ 122 | "archive:https://opam.ocaml.org/cache/md5/90/9033e02283aa3bde9f97f24e632902e3#md5:9033e02283aa3bde9f97f24e632902e3", 123 | "archive:https://github.com/c-cube/seq/archive/0.2.2.tar.gz#md5:9033e02283aa3bde9f97f24e632902e3" 124 | ], 125 | "opam": { 126 | "name": "seq", 127 | "version": "0.2.2", 128 | "path": "esy.lock/opam/seq.0.2.2" 129 | } 130 | }, 131 | "overrides": [], 132 | "dependencies": [ 133 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae", 134 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 135 | ], 136 | "devDependencies": [ 137 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae" 138 | ] 139 | }, 140 | "@opam/result@opam:1.4@dc720aef": { 141 | "id": "@opam/result@opam:1.4@dc720aef", 142 | "name": "@opam/result", 143 | "version": "opam:1.4", 144 | "source": { 145 | "type": "install", 146 | "source": [ 147 | "archive:https://opam.ocaml.org/cache/md5/d3/d3162dbc501a2af65c8c71e0866541da#md5:d3162dbc501a2af65c8c71e0866541da", 148 | "archive:https://github.com/janestreet/result/archive/1.4.tar.gz#md5:d3162dbc501a2af65c8c71e0866541da" 149 | ], 150 | "opam": { 151 | "name": "result", 152 | "version": "1.4", 153 | "path": "esy.lock/opam/result.1.4" 154 | } 155 | }, 156 | "overrides": [], 157 | "dependencies": [ 158 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae", 159 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 160 | ], 161 | "devDependencies": [ 162 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae" 163 | ] 164 | }, 165 | "@opam/re@opam:1.9.0@d4d5e13d": { 166 | "id": "@opam/re@opam:1.9.0@d4d5e13d", 167 | "name": "@opam/re", 168 | "version": "opam:1.9.0", 169 | "source": { 170 | "type": "install", 171 | "source": [ 172 | "archive:https://opam.ocaml.org/cache/md5/bd/bddaed4f386a22cace7850c9c7dac296#md5:bddaed4f386a22cace7850c9c7dac296", 173 | "archive:https://github.com/ocaml/ocaml-re/releases/download/1.9.0/re-1.9.0.tbz#md5:bddaed4f386a22cace7850c9c7dac296" 174 | ], 175 | "opam": { 176 | "name": "re", 177 | "version": "1.9.0", 178 | "path": "esy.lock/opam/re.1.9.0" 179 | } 180 | }, 181 | "overrides": [], 182 | "dependencies": [ 183 | "ocaml@4.6.1000@d41d8cd9", "@opam/seq@opam:0.2.2@e9144e45", 184 | "@opam/dune@opam:1.11.4@a7ccb7ae", "@esy-ocaml/substs@0.0.1@d41d8cd9" 185 | ], 186 | "devDependencies": [ 187 | "ocaml@4.6.1000@d41d8cd9", "@opam/seq@opam:0.2.2@e9144e45", 188 | "@opam/dune@opam:1.11.4@a7ccb7ae" 189 | ] 190 | }, 191 | "@opam/ppx_derivers@opam:1.2.1@ecf0aa45": { 192 | "id": "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", 193 | "name": "@opam/ppx_derivers", 194 | "version": "opam:1.2.1", 195 | "source": { 196 | "type": "install", 197 | "source": [ 198 | "archive:https://opam.ocaml.org/cache/md5/5d/5dc2bf130c1db3c731fe0fffc5648b41#md5:5dc2bf130c1db3c731fe0fffc5648b41", 199 | "archive:https://github.com/ocaml-ppx/ppx_derivers/archive/1.2.1.tar.gz#md5:5dc2bf130c1db3c731fe0fffc5648b41" 200 | ], 201 | "opam": { 202 | "name": "ppx_derivers", 203 | "version": "1.2.1", 204 | "path": "esy.lock/opam/ppx_derivers.1.2.1" 205 | } 206 | }, 207 | "overrides": [], 208 | "dependencies": [ 209 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae", 210 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 211 | ], 212 | "devDependencies": [ 213 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae" 214 | ] 215 | }, 216 | "@opam/ocamlfind@opam:1.8.1@ff07b0f9": { 217 | "id": "@opam/ocamlfind@opam:1.8.1@ff07b0f9", 218 | "name": "@opam/ocamlfind", 219 | "version": "opam:1.8.1", 220 | "source": { 221 | "type": "install", 222 | "source": [ 223 | "archive:https://opam.ocaml.org/cache/md5/18/18ca650982c15536616dea0e422cbd8c#md5:18ca650982c15536616dea0e422cbd8c", 224 | "archive:http://download2.camlcity.org/download/findlib-1.8.1.tar.gz#md5:18ca650982c15536616dea0e422cbd8c", 225 | "archive:http://download.camlcity.org/download/findlib-1.8.1.tar.gz#md5:18ca650982c15536616dea0e422cbd8c" 226 | ], 227 | "opam": { 228 | "name": "ocamlfind", 229 | "version": "1.8.1", 230 | "path": "esy.lock/opam/ocamlfind.1.8.1" 231 | } 232 | }, 233 | "overrides": [ 234 | { 235 | "opamoverride": 236 | "esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override" 237 | } 238 | ], 239 | "dependencies": [ 240 | "ocaml@4.6.1000@d41d8cd9", "@opam/conf-m4@opam:1@3b2b148a", 241 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 242 | ], 243 | "devDependencies": [ "ocaml@4.6.1000@d41d8cd9" ] 244 | }, 245 | "@opam/ocamlbuild@opam:0.14.0@6ac75d03": { 246 | "id": "@opam/ocamlbuild@opam:0.14.0@6ac75d03", 247 | "name": "@opam/ocamlbuild", 248 | "version": "opam:0.14.0", 249 | "source": { 250 | "type": "install", 251 | "source": [ 252 | "archive:https://opam.ocaml.org/cache/sha256/87/87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78#sha256:87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78", 253 | "archive:https://github.com/ocaml/ocamlbuild/archive/0.14.0.tar.gz#sha256:87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78" 254 | ], 255 | "opam": { 256 | "name": "ocamlbuild", 257 | "version": "0.14.0", 258 | "path": "esy.lock/opam/ocamlbuild.0.14.0" 259 | } 260 | }, 261 | "overrides": [ 262 | { 263 | "opamoverride": 264 | "esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override" 265 | } 266 | ], 267 | "dependencies": [ 268 | "ocaml@4.6.1000@d41d8cd9", "@esy-ocaml/substs@0.0.1@d41d8cd9" 269 | ], 270 | "devDependencies": [ "ocaml@4.6.1000@d41d8cd9" ] 271 | }, 272 | "@opam/ocaml-migrate-parsetree@opam:1.5.0@3e319dbc": { 273 | "id": "@opam/ocaml-migrate-parsetree@opam:1.5.0@3e319dbc", 274 | "name": "@opam/ocaml-migrate-parsetree", 275 | "version": "opam:1.5.0", 276 | "source": { 277 | "type": "install", 278 | "source": [ 279 | "archive:https://opam.ocaml.org/cache/sha256/7f/7f56679c9561552762666de5b6b81c8e4cc2e9fd92272e2269878a2eb534e3c0#sha256:7f56679c9561552762666de5b6b81c8e4cc2e9fd92272e2269878a2eb534e3c0", 280 | "archive:https://github.com/ocaml-ppx/ocaml-migrate-parsetree/releases/download/v1.5.0/ocaml-migrate-parsetree-v1.5.0.tbz#sha256:7f56679c9561552762666de5b6b81c8e4cc2e9fd92272e2269878a2eb534e3c0" 281 | ], 282 | "opam": { 283 | "name": "ocaml-migrate-parsetree", 284 | "version": "1.5.0", 285 | "path": "esy.lock/opam/ocaml-migrate-parsetree.1.5.0" 286 | } 287 | }, 288 | "overrides": [], 289 | "dependencies": [ 290 | "ocaml@4.6.1000@d41d8cd9", "@opam/result@opam:1.4@dc720aef", 291 | "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", 292 | "@opam/dune@opam:1.11.4@a7ccb7ae", "@esy-ocaml/substs@0.0.1@d41d8cd9" 293 | ], 294 | "devDependencies": [ 295 | "ocaml@4.6.1000@d41d8cd9", "@opam/result@opam:1.4@dc720aef", 296 | "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", 297 | "@opam/dune@opam:1.11.4@a7ccb7ae" 298 | ] 299 | }, 300 | "@opam/merlin-extend@opam:0.5@a5dd7d4b": { 301 | "id": "@opam/merlin-extend@opam:0.5@a5dd7d4b", 302 | "name": "@opam/merlin-extend", 303 | "version": "opam:0.5", 304 | "source": { 305 | "type": "install", 306 | "source": [ 307 | "archive:https://opam.ocaml.org/cache/sha256/ca/ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227#sha256:ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227", 308 | "archive:https://github.com/let-def/merlin-extend/releases/download/v0.5/merlin-extend-v0.5.tbz#sha256:ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227" 309 | ], 310 | "opam": { 311 | "name": "merlin-extend", 312 | "version": "0.5", 313 | "path": "esy.lock/opam/merlin-extend.0.5" 314 | } 315 | }, 316 | "overrides": [], 317 | "dependencies": [ 318 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae", 319 | "@opam/cppo@opam:1.6.6@f4f83858", "@esy-ocaml/substs@0.0.1@d41d8cd9" 320 | ], 321 | "devDependencies": [ 322 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae" 323 | ] 324 | }, 325 | "@opam/merlin@opam:3.3.3@d653b06a": { 326 | "id": "@opam/merlin@opam:3.3.3@d653b06a", 327 | "name": "@opam/merlin", 328 | "version": "opam:3.3.3", 329 | "source": { 330 | "type": "install", 331 | "source": [ 332 | "archive:https://opam.ocaml.org/cache/sha256/72/72909ef47eea1f6fca13b4109a34dccf8fe3923a3c026f1ed1db9eb5ee9aae15#sha256:72909ef47eea1f6fca13b4109a34dccf8fe3923a3c026f1ed1db9eb5ee9aae15", 333 | "archive:https://github.com/ocaml/merlin/releases/download/v3.3.3/merlin-v3.3.3.tbz#sha256:72909ef47eea1f6fca13b4109a34dccf8fe3923a3c026f1ed1db9eb5ee9aae15" 334 | ], 335 | "opam": { 336 | "name": "merlin", 337 | "version": "3.3.3", 338 | "path": "esy.lock/opam/merlin.3.3.3" 339 | } 340 | }, 341 | "overrides": [], 342 | "dependencies": [ 343 | "ocaml@4.6.1000@d41d8cd9", "@opam/yojson@opam:1.7.0@7056d985", 344 | "@opam/ocamlfind@opam:1.8.1@ff07b0f9", 345 | "@opam/dune@opam:1.11.4@a7ccb7ae", "@esy-ocaml/substs@0.0.1@d41d8cd9" 346 | ], 347 | "devDependencies": [ 348 | "ocaml@4.6.1000@d41d8cd9", "@opam/yojson@opam:1.7.0@7056d985", 349 | "@opam/ocamlfind@opam:1.8.1@ff07b0f9", 350 | "@opam/dune@opam:1.11.4@a7ccb7ae" 351 | ] 352 | }, 353 | "@opam/menhir@opam:20190924@004407ff": { 354 | "id": "@opam/menhir@opam:20190924@004407ff", 355 | "name": "@opam/menhir", 356 | "version": "opam:20190924", 357 | "source": { 358 | "type": "install", 359 | "source": [ 360 | "archive:https://opam.ocaml.org/cache/md5/67/677f1997fb73177d5a00fa1b8d61c3ef#md5:677f1997fb73177d5a00fa1b8d61c3ef", 361 | "archive:https://gitlab.inria.fr/fpottier/menhir/repository/20190924/archive.tar.gz#md5:677f1997fb73177d5a00fa1b8d61c3ef" 362 | ], 363 | "opam": { 364 | "name": "menhir", 365 | "version": "20190924", 366 | "path": "esy.lock/opam/menhir.20190924" 367 | } 368 | }, 369 | "overrides": [], 370 | "dependencies": [ 371 | "ocaml@4.6.1000@d41d8cd9", "@opam/ocamlfind@opam:1.8.1@ff07b0f9", 372 | "@opam/ocamlbuild@opam:0.14.0@6ac75d03", 373 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 374 | ], 375 | "devDependencies": [ "ocaml@4.6.1000@d41d8cd9" ] 376 | }, 377 | "@opam/jbuilder@opam:transition@20522f05": { 378 | "id": "@opam/jbuilder@opam:transition@20522f05", 379 | "name": "@opam/jbuilder", 380 | "version": "opam:transition", 381 | "source": { 382 | "type": "install", 383 | "source": [ "no-source:" ], 384 | "opam": { 385 | "name": "jbuilder", 386 | "version": "transition", 387 | "path": "esy.lock/opam/jbuilder.transition" 388 | } 389 | }, 390 | "overrides": [], 391 | "dependencies": [ 392 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae", 393 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 394 | ], 395 | "devDependencies": [ 396 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae" 397 | ] 398 | }, 399 | "@opam/easy-format@opam:1.3.2@0484b3c4": { 400 | "id": "@opam/easy-format@opam:1.3.2@0484b3c4", 401 | "name": "@opam/easy-format", 402 | "version": "opam:1.3.2", 403 | "source": { 404 | "type": "install", 405 | "source": [ 406 | "archive:https://opam.ocaml.org/cache/sha256/34/3440c2b882d537ae5e9011eb06abb53f5667e651ea4bb3b460ea8230fa8c1926#sha256:3440c2b882d537ae5e9011eb06abb53f5667e651ea4bb3b460ea8230fa8c1926", 407 | "archive:https://github.com/mjambon/easy-format/releases/download/1.3.2/easy-format-1.3.2.tbz#sha256:3440c2b882d537ae5e9011eb06abb53f5667e651ea4bb3b460ea8230fa8c1926" 408 | ], 409 | "opam": { 410 | "name": "easy-format", 411 | "version": "1.3.2", 412 | "path": "esy.lock/opam/easy-format.1.3.2" 413 | } 414 | }, 415 | "overrides": [], 416 | "dependencies": [ 417 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae", 418 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 419 | ], 420 | "devDependencies": [ 421 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae" 422 | ] 423 | }, 424 | "@opam/dune@opam:1.11.4@a7ccb7ae": { 425 | "id": "@opam/dune@opam:1.11.4@a7ccb7ae", 426 | "name": "@opam/dune", 427 | "version": "opam:1.11.4", 428 | "source": { 429 | "type": "install", 430 | "source": [ 431 | "archive:https://opam.ocaml.org/cache/sha256/77/77cb5f483221b266ded2b85fc84173ae0089a25134a086be922e82c131456ce6#sha256:77cb5f483221b266ded2b85fc84173ae0089a25134a086be922e82c131456ce6", 432 | "archive:https://github.com/ocaml/dune/releases/download/1.11.4/dune-build-info-1.11.4.tbz#sha256:77cb5f483221b266ded2b85fc84173ae0089a25134a086be922e82c131456ce6" 433 | ], 434 | "opam": { 435 | "name": "dune", 436 | "version": "1.11.4", 437 | "path": "esy.lock/opam/dune.1.11.4" 438 | } 439 | }, 440 | "overrides": [], 441 | "dependencies": [ 442 | "ocaml@4.6.1000@d41d8cd9", "@opam/base-unix@opam:base@87d0b2eb", 443 | "@opam/base-threads@opam:base@36803084", 444 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 445 | ], 446 | "devDependencies": [ 447 | "ocaml@4.6.1000@d41d8cd9", "@opam/base-unix@opam:base@87d0b2eb", 448 | "@opam/base-threads@opam:base@36803084" 449 | ] 450 | }, 451 | "@opam/cppo@opam:1.6.6@f4f83858": { 452 | "id": "@opam/cppo@opam:1.6.6@f4f83858", 453 | "name": "@opam/cppo", 454 | "version": "opam:1.6.6", 455 | "source": { 456 | "type": "install", 457 | "source": [ 458 | "archive:https://opam.ocaml.org/cache/sha256/e7/e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0#sha256:e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0", 459 | "archive:https://github.com/ocaml-community/cppo/releases/download/v1.6.6/cppo-v1.6.6.tbz#sha256:e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0" 460 | ], 461 | "opam": { 462 | "name": "cppo", 463 | "version": "1.6.6", 464 | "path": "esy.lock/opam/cppo.1.6.6" 465 | } 466 | }, 467 | "overrides": [], 468 | "dependencies": [ 469 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae", 470 | "@opam/base-unix@opam:base@87d0b2eb", 471 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 472 | ], 473 | "devDependencies": [ 474 | "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.4@a7ccb7ae", 475 | "@opam/base-unix@opam:base@87d0b2eb" 476 | ] 477 | }, 478 | "@opam/conf-m4@opam:1@3b2b148a": { 479 | "id": "@opam/conf-m4@opam:1@3b2b148a", 480 | "name": "@opam/conf-m4", 481 | "version": "opam:1", 482 | "source": { 483 | "type": "install", 484 | "source": [ "no-source:" ], 485 | "opam": { 486 | "name": "conf-m4", 487 | "version": "1", 488 | "path": "esy.lock/opam/conf-m4.1" 489 | } 490 | }, 491 | "overrides": [], 492 | "dependencies": [ "@esy-ocaml/substs@0.0.1@d41d8cd9" ], 493 | "devDependencies": [] 494 | }, 495 | "@opam/biniou@opam:1.2.1@d7570399": { 496 | "id": "@opam/biniou@opam:1.2.1@d7570399", 497 | "name": "@opam/biniou", 498 | "version": "opam:1.2.1", 499 | "source": { 500 | "type": "install", 501 | "source": [ 502 | "archive:https://opam.ocaml.org/cache/sha256/35/35546c68b1929a8e6d27a3b39ecd17b38303a0d47e65eb9d1480c2061ea84335#sha256:35546c68b1929a8e6d27a3b39ecd17b38303a0d47e65eb9d1480c2061ea84335", 503 | "archive:https://github.com/mjambon/biniou/releases/download/1.2.1/biniou-1.2.1.tbz#sha256:35546c68b1929a8e6d27a3b39ecd17b38303a0d47e65eb9d1480c2061ea84335" 504 | ], 505 | "opam": { 506 | "name": "biniou", 507 | "version": "1.2.1", 508 | "path": "esy.lock/opam/biniou.1.2.1" 509 | } 510 | }, 511 | "overrides": [], 512 | "dependencies": [ 513 | "ocaml@4.6.1000@d41d8cd9", "@opam/easy-format@opam:1.3.2@0484b3c4", 514 | "@opam/dune@opam:1.11.4@a7ccb7ae", "@esy-ocaml/substs@0.0.1@d41d8cd9" 515 | ], 516 | "devDependencies": [ 517 | "ocaml@4.6.1000@d41d8cd9", "@opam/easy-format@opam:1.3.2@0484b3c4", 518 | "@opam/dune@opam:1.11.4@a7ccb7ae" 519 | ] 520 | }, 521 | "@opam/base-unix@opam:base@87d0b2eb": { 522 | "id": "@opam/base-unix@opam:base@87d0b2eb", 523 | "name": "@opam/base-unix", 524 | "version": "opam:base", 525 | "source": { 526 | "type": "install", 527 | "source": [ "no-source:" ], 528 | "opam": { 529 | "name": "base-unix", 530 | "version": "base", 531 | "path": "esy.lock/opam/base-unix.base" 532 | } 533 | }, 534 | "overrides": [], 535 | "dependencies": [ "@esy-ocaml/substs@0.0.1@d41d8cd9" ], 536 | "devDependencies": [] 537 | }, 538 | "@opam/base-threads@opam:base@36803084": { 539 | "id": "@opam/base-threads@opam:base@36803084", 540 | "name": "@opam/base-threads", 541 | "version": "opam:base", 542 | "source": { 543 | "type": "install", 544 | "source": [ "no-source:" ], 545 | "opam": { 546 | "name": "base-threads", 547 | "version": "base", 548 | "path": "esy.lock/opam/base-threads.base" 549 | } 550 | }, 551 | "overrides": [], 552 | "dependencies": [ "@esy-ocaml/substs@0.0.1@d41d8cd9" ], 553 | "devDependencies": [] 554 | }, 555 | "@opam/atdgen-runtime@opam:2.0.0@60f6faab": { 556 | "id": "@opam/atdgen-runtime@opam:2.0.0@60f6faab", 557 | "name": "@opam/atdgen-runtime", 558 | "version": "opam:2.0.0", 559 | "source": { 560 | "type": "install", 561 | "source": [ 562 | "archive:https://opam.ocaml.org/cache/md5/14/14e47609397c524ea0eae7c3f14f7ccf#md5:14e47609397c524ea0eae7c3f14f7ccf", 563 | "archive:https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz#md5:14e47609397c524ea0eae7c3f14f7ccf" 564 | ], 565 | "opam": { 566 | "name": "atdgen-runtime", 567 | "version": "2.0.0", 568 | "path": "esy.lock/opam/atdgen-runtime.2.0.0" 569 | } 570 | }, 571 | "overrides": [], 572 | "dependencies": [ 573 | "ocaml@4.6.1000@d41d8cd9", "@opam/yojson@opam:1.7.0@7056d985", 574 | "@opam/jbuilder@opam:transition@20522f05", 575 | "@opam/biniou@opam:1.2.1@d7570399", 576 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 577 | ], 578 | "devDependencies": [ 579 | "ocaml@4.6.1000@d41d8cd9", "@opam/yojson@opam:1.7.0@7056d985", 580 | "@opam/jbuilder@opam:transition@20522f05", 581 | "@opam/biniou@opam:1.2.1@d7570399" 582 | ] 583 | }, 584 | "@opam/atdgen@opam:2.0.0@46af0360": { 585 | "id": "@opam/atdgen@opam:2.0.0@46af0360", 586 | "name": "@opam/atdgen", 587 | "version": "opam:2.0.0", 588 | "source": { 589 | "type": "install", 590 | "source": [ 591 | "archive:https://opam.ocaml.org/cache/md5/14/14e47609397c524ea0eae7c3f14f7ccf#md5:14e47609397c524ea0eae7c3f14f7ccf", 592 | "archive:https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz#md5:14e47609397c524ea0eae7c3f14f7ccf" 593 | ], 594 | "opam": { 595 | "name": "atdgen", 596 | "version": "2.0.0", 597 | "path": "esy.lock/opam/atdgen.2.0.0" 598 | } 599 | }, 600 | "overrides": [], 601 | "dependencies": [ 602 | "ocaml@4.6.1000@d41d8cd9", "@opam/yojson@opam:1.7.0@7056d985", 603 | "@opam/jbuilder@opam:transition@20522f05", 604 | "@opam/biniou@opam:1.2.1@d7570399", 605 | "@opam/atdgen-runtime@opam:2.0.0@60f6faab", 606 | "@opam/atd@opam:2.0.0@e0ddd12f", "@esy-ocaml/substs@0.0.1@d41d8cd9" 607 | ], 608 | "devDependencies": [ 609 | "ocaml@4.6.1000@d41d8cd9", "@opam/yojson@opam:1.7.0@7056d985", 610 | "@opam/jbuilder@opam:transition@20522f05", 611 | "@opam/biniou@opam:1.2.1@d7570399", 612 | "@opam/atdgen-runtime@opam:2.0.0@60f6faab", 613 | "@opam/atd@opam:2.0.0@e0ddd12f" 614 | ] 615 | }, 616 | "@opam/atd@opam:2.0.0@e0ddd12f": { 617 | "id": "@opam/atd@opam:2.0.0@e0ddd12f", 618 | "name": "@opam/atd", 619 | "version": "opam:2.0.0", 620 | "source": { 621 | "type": "install", 622 | "source": [ 623 | "archive:https://opam.ocaml.org/cache/md5/14/14e47609397c524ea0eae7c3f14f7ccf#md5:14e47609397c524ea0eae7c3f14f7ccf", 624 | "archive:https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz#md5:14e47609397c524ea0eae7c3f14f7ccf" 625 | ], 626 | "opam": { 627 | "name": "atd", 628 | "version": "2.0.0", 629 | "path": "esy.lock/opam/atd.2.0.0" 630 | } 631 | }, 632 | "overrides": [], 633 | "dependencies": [ 634 | "ocaml@4.6.1000@d41d8cd9", "@opam/menhir@opam:20190924@004407ff", 635 | "@opam/jbuilder@opam:transition@20522f05", 636 | "@opam/easy-format@opam:1.3.2@0484b3c4", 637 | "@esy-ocaml/substs@0.0.1@d41d8cd9" 638 | ], 639 | "devDependencies": [ 640 | "ocaml@4.6.1000@d41d8cd9", "@opam/jbuilder@opam:transition@20522f05", 641 | "@opam/easy-format@opam:1.3.2@0484b3c4" 642 | ] 643 | }, 644 | "@esy-ocaml/substs@0.0.1@d41d8cd9": { 645 | "id": "@esy-ocaml/substs@0.0.1@d41d8cd9", 646 | "name": "@esy-ocaml/substs", 647 | "version": "0.0.1", 648 | "source": { 649 | "type": "install", 650 | "source": [ 651 | "archive:https://registry.npmjs.org/@esy-ocaml/substs/-/substs-0.0.1.tgz#sha1:59ebdbbaedcda123fc7ed8fb2b302b7d819e9a46" 652 | ] 653 | }, 654 | "overrides": [], 655 | "dependencies": [], 656 | "devDependencies": [] 657 | }, 658 | "@esy-ocaml/reason@3.5.2@d41d8cd9": { 659 | "id": "@esy-ocaml/reason@3.5.2@d41d8cd9", 660 | "name": "@esy-ocaml/reason", 661 | "version": "3.5.2", 662 | "source": { 663 | "type": "install", 664 | "source": [ 665 | "archive:https://registry.npmjs.org/@esy-ocaml/reason/-/reason-3.5.2.tgz#sha1:ac48b63fd66fbbc1d77ab6a2b7e3a1ba21a8f40b" 666 | ] 667 | }, 668 | "overrides": [], 669 | "dependencies": [ 670 | "ocaml@4.6.1000@d41d8cd9", "@opam/result@opam:1.4@dc720aef", 671 | "@opam/ocamlfind@opam:1.8.1@ff07b0f9", 672 | "@opam/ocaml-migrate-parsetree@opam:1.5.0@3e319dbc", 673 | "@opam/merlin-extend@opam:0.5@a5dd7d4b", 674 | "@opam/menhir@opam:20190924@004407ff", 675 | "@opam/dune@opam:1.11.4@a7ccb7ae" 676 | ], 677 | "devDependencies": [] 678 | } 679 | } 680 | } -------------------------------------------------------------------------------- /esy.lock/opam/atd.2.0.0/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "martin@mjambon.com" 3 | authors: ["Martin Jambon"] 4 | 5 | homepage: "https://github.com/mjambon/atd" 6 | bug-reports: "https://github.com/mjambon/atd/issues" 7 | dev-repo: "git://github.com/mjambon/atd.git" 8 | 9 | build: [ 10 | ["jbuilder" "subst" "-p" name] {pinned} 11 | ["jbuilder" "build" "-p" name "-j" jobs] 12 | ] 13 | 14 | # Restore when https://github.com/mjambon/atd/issues/121 is resolved. 15 | # build-test: [ 16 | # ["jbuilder" "runtest" "-p" name] 17 | # ] 18 | 19 | depends: [ 20 | "ocaml" {>= "4.03.0"} 21 | "jbuilder" 22 | "menhir" {build} 23 | "easy-format" 24 | ] 25 | synopsis: "Parser for the ATD data format description language" 26 | description: """ 27 | ATD is the OCaml library providing a parser for the ATD language and 28 | various utilities. ATD stands for Adjustable Type Definitions in 29 | reference to its main property of supporting annotations that allow a 30 | good fit with a variety of data formats.""" 31 | url { 32 | src: "https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz" 33 | checksum: "md5=14e47609397c524ea0eae7c3f14f7ccf" 34 | } 35 | -------------------------------------------------------------------------------- /esy.lock/opam/atdgen-runtime.2.0.0/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "martin@mjambon.com" 3 | authors: ["Martin Jambon"] 4 | 5 | homepage: "https://github.com/mjambon/atd" 6 | bug-reports: "https://github.com/mjambon/atd/issues" 7 | dev-repo: "git://github.com/mjambon/atd.git" 8 | 9 | build: [ 10 | ["jbuilder" "subst" "-p" name] {pinned} 11 | ["jbuilder" "build" "-p" name "-j" jobs] 12 | ] 13 | 14 | # Restore when https://github.com/mjambon/atd/issues/121 is resolved. 15 | # build-test: [ 16 | # ["jbuilder" "runtest" "-p" name] 17 | # ] 18 | 19 | depends: [ 20 | "ocaml" {>= "4.02.3"} 21 | "jbuilder" 22 | "biniou" {>= "1.0.6"} 23 | "yojson" {>= "1.2.1"} 24 | ] 25 | synopsis: "Runtime library for code generated by atdgen." 26 | url { 27 | src: "https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz" 28 | checksum: "md5=14e47609397c524ea0eae7c3f14f7ccf" 29 | } 30 | -------------------------------------------------------------------------------- /esy.lock/opam/atdgen.2.0.0/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "martin@mjambon.com" 3 | authors: ["Martin Jambon"] 4 | 5 | homepage: "https://github.com/mjambon/atd" 6 | bug-reports: "https://github.com/mjambon/atd/issues" 7 | dev-repo: "git://github.com/mjambon/atd.git" 8 | 9 | build: [ 10 | ["jbuilder" "subst" "-p" name] {pinned} 11 | ["jbuilder" "build" "-p" name "-j" jobs] 12 | ] 13 | 14 | # Restore when https://github.com/mjambon/atd/issues/121 is resolved. 15 | # build-test: [ 16 | # ["jbuilder" "runtest" "-p" name] 17 | # ] 18 | 19 | depends: [ 20 | "ocaml" {>= "4.03.0"} 21 | "jbuilder" 22 | "atd" {>= "2.0.0"} 23 | "atdgen-runtime" {>= "2.0.0"} 24 | "biniou" {>= "1.0.6"} 25 | "yojson" {>= "1.2.1"} 26 | ] 27 | synopsis: 28 | "Generates efficient JSON serializers, deserializers and validators" 29 | description: """ 30 | Atdgen is a command-line program that takes as input type definitions in the 31 | ATD syntax and produces OCaml code suitable for data serialization and 32 | deserialization. 33 | 34 | Two data formats are currently supported, these are biniou and JSON. 35 | Atdgen-biniou and Atdgen-json will refer to Atdgen used in one context or the 36 | other. 37 | 38 | Atdgen was designed with efficiency and durability in mind. Software authors 39 | are encouraged to use Atdgen directly and to write tools that may reuse part of 40 | Atdgen’s source code.""" 41 | url { 42 | src: "https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz" 43 | checksum: "md5=14e47609397c524ea0eae7c3f14f7ccf" 44 | } 45 | -------------------------------------------------------------------------------- /esy.lock/opam/base-threads.base/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "https://github.com/ocaml/opam-repository/issues" 3 | description: """ 4 | Threads library distributed with the OCaml compiler 5 | """ 6 | 7 | -------------------------------------------------------------------------------- /esy.lock/opam/base-unix.base/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "https://github.com/ocaml/opam-repository/issues" 3 | description: """ 4 | Unix library distributed with the OCaml compiler 5 | """ 6 | 7 | -------------------------------------------------------------------------------- /esy.lock/opam/biniou.1.2.1/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | build: [ 3 | ["dune" "subst"] {pinned} 4 | ["dune" "build" "-p" name "-j" jobs] 5 | ["dune" "runtest" "-p" name "-j" jobs] {with-test} 6 | ["dune" "build" "-p" name "@doc"] {with-doc} 7 | ] 8 | maintainer: ["martin@mjambon.com"] 9 | authors: ["Martin Jambon"] 10 | bug-reports: "https://github.com/mjambon/biniou/issues" 11 | homepage: "https://github.com/mjambon/biniou" 12 | doc: "https://mjambon.github.io/biniou/" 13 | license: "BSD-3-Clause" 14 | dev-repo: "git+https://github.com/mjambon/biniou.git" 15 | synopsis: 16 | "Binary data format designed for speed, safety, ease of use and backward compatibility as protocols evolve" 17 | description: """ 18 | 19 | Biniou (pronounced "be new") is a binary data format designed for speed, safety, 20 | ease of use and backward compatibility as protocols evolve. Biniou is vastly 21 | equivalent to JSON in terms of functionality but allows implementations several 22 | times faster (4 times faster than yojson), with 25-35% space savings. 23 | 24 | Biniou data can be decoded into human-readable form without knowledge of type 25 | definitions except for field and variant names which are represented by 31-bit 26 | hashes. A program named bdump is provided for routine visualization of biniou 27 | data files. 28 | 29 | The program atdgen is used to derive OCaml-Biniou serializers and deserializers 30 | from type definitions. 31 | 32 | Biniou format specification: mjambon.github.io/atdgen-doc/biniou-format.txt""" 33 | depends: [ 34 | "easy-format" 35 | "dune" {>= "1.10"} 36 | "ocaml" {>= "4.02.3"} 37 | ] 38 | url { 39 | src: 40 | "https://github.com/mjambon/biniou/releases/download/1.2.1/biniou-1.2.1.tbz" 41 | checksum: [ 42 | "sha256=35546c68b1929a8e6d27a3b39ecd17b38303a0d47e65eb9d1480c2061ea84335" 43 | "sha512=82670cc77bf3e869ee26e5fbe5a5affa45a22bc8b6c4bd7e85473912780e0111baca59b34a2c14feae3543ce6e239d7fddaeab24b686a65bfe642cdb91d27ebf" 44 | ] 45 | } 46 | -------------------------------------------------------------------------------- /esy.lock/opam/conf-m4.1/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "tim@gfxmonk.net" 3 | homepage: "http://www.gnu.org/software/m4/m4.html" 4 | bug-reports: "https://github.com/ocaml/opam-repository/issues" 5 | authors: "GNU Project" 6 | license: "GPL-3.0-only" 7 | build: [["sh" "-exc" "echo | m4"]] 8 | depexts: [ 9 | ["m4"] {os-family = "debian"} 10 | ["m4"] {os-distribution = "fedora"} 11 | ["m4"] {os-distribution = "rhel"} 12 | ["m4"] {os-distribution = "centos"} 13 | ["m4"] {os-distribution = "alpine"} 14 | ["m4"] {os-distribution = "nixos"} 15 | ["m4"] {os-family = "suse"} 16 | ["m4"] {os-distribution = "ol"} 17 | ["m4"] {os-distribution = "arch"} 18 | ] 19 | synopsis: "Virtual package relying on m4" 20 | description: 21 | "This package can only install if the m4 binary is installed on the system." 22 | flags: conf 23 | -------------------------------------------------------------------------------- /esy.lock/opam/cppo.1.6.6/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "martin@mjambon.com" 3 | authors: "Martin Jambon" 4 | license: "BSD-3-Clause" 5 | homepage: "http://mjambon.com/cppo.html" 6 | doc: "https://ocaml-community.github.io/cppo/" 7 | bug-reports: "https://github.com/ocaml-community/cppo/issues" 8 | depends: [ 9 | "ocaml" {>= "4.03"} 10 | "dune" {>= "1.0"} 11 | "base-unix" 12 | ] 13 | build: [ 14 | ["dune" "subst"] {pinned} 15 | ["dune" "build" "-p" name "-j" jobs] 16 | ["dune" "runtest" "-p" name "-j" jobs] {with-test} 17 | ] 18 | dev-repo: "git+https://github.com/ocaml-community/cppo.git" 19 | synopsis: "Code preprocessor like cpp for OCaml" 20 | description: """ 21 | Cppo is an equivalent of the C preprocessor for OCaml programs. 22 | It allows the definition of simple macros and file inclusion. 23 | 24 | Cppo is: 25 | 26 | * more OCaml-friendly than cpp 27 | * easy to learn without consulting a manual 28 | * reasonably fast 29 | * simple to install and to maintain 30 | """ 31 | url { 32 | src: "https://github.com/ocaml-community/cppo/releases/download/v1.6.6/cppo-v1.6.6.tbz" 33 | checksum: [ 34 | "sha256=e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0" 35 | "sha512=44ecf9d225d9e45490a2feac0bde04865ca398dba6c3579e3370fcd1ea255707b8883590852af8b2df87123801062b9f3acce2455c092deabf431f9c4fb8d8eb" 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /esy.lock/opam/dune.1.11.4/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | synopsis: "Fast, portable and opinionated build system" 3 | description: """ 4 | 5 | dune is a build system that was designed to simplify the release of 6 | Jane Street packages. It reads metadata from "dune" files following a 7 | very simple s-expression syntax. 8 | 9 | dune is fast, it has very low-overhead and support parallel builds on 10 | all platforms. It has no system dependencies, all you need to build 11 | dune and packages using dune is OCaml. You don't need or make or bash 12 | as long as the packages themselves don't use bash explicitly. 13 | 14 | dune supports multi-package development by simply dropping multiple 15 | repositories into the same directory. 16 | 17 | It also supports multi-context builds, such as building against 18 | several opam roots/switches simultaneously. This helps maintaining 19 | packages across several versions of OCaml and gives cross-compilation 20 | for free. 21 | """ 22 | maintainer: ["Jane Street Group, LLC "] 23 | authors: ["Jane Street Group, LLC "] 24 | license: "MIT" 25 | homepage: "https://github.com/ocaml/dune" 26 | doc: "https://dune.readthedocs.io/" 27 | bug-reports: "https://github.com/ocaml/dune/issues" 28 | depends: [ 29 | "ocaml" {>= "4.02"} 30 | "base-unix" 31 | "base-threads" 32 | ] 33 | conflicts: [ 34 | "jbuilder" {!= "transition"} 35 | "odoc" {< "1.3.0"} 36 | "dune-release" {< "1.3.0"} 37 | ] 38 | dev-repo: "git+https://github.com/ocaml/dune.git" 39 | build: [ 40 | # opam 2 sets OPAM_SWITCH_PREFIX, so we don't need a hardcoded path 41 | ["ocaml" "configure.ml" "--libdir" lib] {opam-version < "2"} 42 | ["ocaml" "bootstrap.ml"] 43 | ["./boot.exe" "--release" "--subst"] {pinned} 44 | ["./boot.exe" "--release" "-j" jobs] 45 | ] 46 | url { 47 | src: 48 | "https://github.com/ocaml/dune/releases/download/1.11.4/dune-build-info-1.11.4.tbz" 49 | checksum: [ 50 | "sha256=77cb5f483221b266ded2b85fc84173ae0089a25134a086be922e82c131456ce6" 51 | "sha512=02f00fd872aa49b832fc8c1e928409f23c79ddf84a53009a58875f222cca36fbb92c905e12c539caec9cbad723f195a8aa24218382dca35a903b3f52b11f06f2" 52 | ] 53 | } 54 | -------------------------------------------------------------------------------- /esy.lock/opam/easy-format.1.3.2/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | build: [ 3 | ["dune" "subst"] {pinned} 4 | ["dune" "build" "-p" name "-j" jobs] 5 | ["dune" "runtest" "-p" name "-j" jobs] {with-test} 6 | ["dune" "build" "-p" name "@doc"] {with-doc} 7 | ] 8 | maintainer: ["martin@mjambon.com" "rudi.grinberg@gmail.com"] 9 | authors: ["Martin Jambon"] 10 | bug-reports: "https://github.com/mjambon/easy-format/issues" 11 | homepage: "https://github.com/mjambon/easy-format" 12 | doc: "https://mjambon.github.io/easy-format/" 13 | license: "BSD-3-Clause" 14 | dev-repo: "git+https://github.com/mjambon/easy-format.git" 15 | synopsis: 16 | "High-level and functional interface to the Format module of the OCaml standard library" 17 | description: """ 18 | 19 | This module offers a high-level and functional interface to the Format module of 20 | the OCaml standard library. It is a pretty-printing facility, i.e. it takes as 21 | input some code represented as a tree and formats this code into the most 22 | visually satisfying result, breaking and indenting lines of code where 23 | appropriate. 24 | 25 | Input data must be first modelled and converted into a tree using 3 kinds of 26 | nodes: 27 | 28 | * atoms 29 | * lists 30 | * labelled nodes 31 | 32 | Atoms represent any text that is guaranteed to be printed as-is. Lists can model 33 | any sequence of items such as arrays of data or lists of definitions that are 34 | labelled with something like "int main", "let x =" or "x:".""" 35 | depends: [ 36 | "dune" {>= "1.10"} 37 | "ocaml" {>= "4.02.3"} 38 | ] 39 | url { 40 | src: 41 | "https://github.com/mjambon/easy-format/releases/download/1.3.2/easy-format-1.3.2.tbz" 42 | checksum: [ 43 | "sha256=3440c2b882d537ae5e9011eb06abb53f5667e651ea4bb3b460ea8230fa8c1926" 44 | "sha512=e39377a2ff020ceb9ac29e8515a89d9bdbc91dfcfa871c4e3baafa56753fac2896768e5d9822a050dc1e2ade43c8967afb69391a386c0a8ecd4e1f774e236135" 45 | ] 46 | } 47 | -------------------------------------------------------------------------------- /esy.lock/opam/jbuilder.transition/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "opensource@janestreet.com" 3 | authors: ["Jane Street Group, LLC "] 4 | homepage: "https://github.com/ocaml/dune" 5 | bug-reports: "https://github.com/ocaml/dune/issues" 6 | dev-repo: "git+https://github.com/ocaml/dune.git" 7 | license: "MIT" 8 | depends: [ 9 | "ocaml" 10 | "dune" {< "2.0"} 11 | ] 12 | post-messages: [ 13 | "Jbuilder has been renamed and the jbuilder package is now a transition \ 14 | package. Use the dune package instead." 15 | ] 16 | synopsis: 17 | "This is a transition package, jbuilder is now named dune. Use the dune" 18 | description: "package instead." 19 | -------------------------------------------------------------------------------- /esy.lock/opam/menhir.20190924/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "francois.pottier@inria.fr" 3 | authors: [ 4 | "François Pottier " 5 | "Yann Régis-Gianas " 6 | ] 7 | homepage: "http://gitlab.inria.fr/fpottier/menhir" 8 | dev-repo: "git+https://gitlab.inria.fr/fpottier/menhir.git" 9 | bug-reports: "menhir@inria.fr" 10 | build: [ 11 | [make "-f" "Makefile" "PREFIX=%{prefix}%" "USE_OCAMLFIND=true" "docdir=%{doc}%/menhir" "libdir=%{lib}%/menhir" "mandir=%{man}%/man1"] 12 | ] 13 | install: [ 14 | [make "-f" "Makefile" "install" "PREFIX=%{prefix}%" "docdir=%{doc}%/menhir" "libdir=%{lib}%/menhir" "mandir=%{man}%/man1"] 15 | ] 16 | depends: [ 17 | "ocaml" {>= "4.02"} 18 | "ocamlfind" {build} 19 | "ocamlbuild" {build} 20 | ] 21 | synopsis: "An LR(1) parser generator" 22 | url { 23 | src: 24 | "https://gitlab.inria.fr/fpottier/menhir/repository/20190924/archive.tar.gz" 25 | checksum: [ 26 | "md5=677f1997fb73177d5a00fa1b8d61c3ef" 27 | "sha512=ea8a9a6d773529cf6ac05e4c6c4532770fbb8e574c9b646efcefe90d9f24544741e3e8cfd94c8afea0447e34059a8c79c2829b46764ce3a3d6dcb3e7f75980fc" 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /esy.lock/opam/merlin-extend.0.5/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "Frederic Bour " 3 | authors: "Frederic Bour " 4 | homepage: "https://github.com/let-def/merlin-extend" 5 | bug-reports: "https://github.com/let-def/merlin-extend" 6 | license: "MIT" 7 | dev-repo: "git+https://github.com/let-def/merlin-extend.git" 8 | build: [ 9 | ["dune" "subst"] {pinned} 10 | ["dune" "build" "-p" name "-j" jobs] 11 | ] 12 | depends: [ 13 | "dune" {>= "1.0"} 14 | "cppo" {build} 15 | "ocaml" {>= "4.02.3"} 16 | ] 17 | synopsis: "A protocol to provide custom frontend to Merlin" 18 | description: """ 19 | This protocol allows to replace the OCaml frontend of Merlin. 20 | It extends what used to be done with the `-pp' flag to handle a few more cases.""" 21 | doc: "https://let-def.github.io/merlin-extend" 22 | url { 23 | src: 24 | "https://github.com/let-def/merlin-extend/releases/download/v0.5/merlin-extend-v0.5.tbz" 25 | checksum: [ 26 | "sha256=ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227" 27 | "sha512=55c5a3637337abb8ca8db679128a81ca8ccce567bc214d55b2e6444dc0e905b74c64d629bdea2457d0fe4be5306414feefcdbc4d4761fdafd59aa107550936b6" 28 | ] 29 | } 30 | -------------------------------------------------------------------------------- /esy.lock/opam/merlin.3.3.3/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "defree@gmail.com" 3 | authors: "The Merlin team" 4 | homepage: "https://github.com/ocaml/merlin" 5 | bug-reports: "https://github.com/ocaml/merlin/issues" 6 | dev-repo: "git+https://github.com/ocaml/merlin.git" 7 | build: [ 8 | ["dune" "subst"] {pinned} 9 | ["dune" "build" "-p" name "-j" jobs] 10 | ["dune" "runtest" "-p" name "-j" jobs] {with-test} 11 | ] 12 | depends: [ 13 | "ocaml" {>= "4.02.1" & < "4.10"} 14 | "dune" {>= "1.8.0"} 15 | "ocamlfind" {>= "1.5.2"} 16 | "yojson" {>= "1.6.0"} 17 | "mdx" {with-test & >= "1.3.0"} 18 | "conf-jq" {with-test} 19 | ] 20 | synopsis: 21 | "Editor helper, provides completion, typing and source browsing in Vim and Emacs" 22 | description: 23 | "Merlin is an assistant for editing OCaml code. It aims to provide the features available in modern IDEs: error reporting, auto completion, source browsing and much more." 24 | post-messages: [ 25 | "merlin installed. 26 | 27 | Quick setup for VIM 28 | ------------------- 29 | Append this to your .vimrc to add merlin to vim's runtime-path: 30 | let g:opamshare = substitute(system('opam config var share'),'\\n$','','''') 31 | execute \"set rtp+=\" . g:opamshare . \"/merlin/vim\" 32 | 33 | Also run the following line in vim to index the documentation: 34 | :execute \"helptags \" . g:opamshare . \"/merlin/vim/doc\" 35 | 36 | Quick setup for EMACS 37 | ------------------- 38 | Add opam emacs directory to your load-path by appending this to your .emacs: 39 | (let ((opam-share (ignore-errors (car (process-lines \"opam\" \"config\" \"var\" \"share\"))))) 40 | (when (and opam-share (file-directory-p opam-share)) 41 | ;; Register Merlin 42 | (add-to-list 'load-path (expand-file-name \"emacs/site-lisp\" opam-share)) 43 | (autoload 'merlin-mode \"merlin\" nil t nil) 44 | ;; Automatically start it in OCaml buffers 45 | (add-hook 'tuareg-mode-hook 'merlin-mode t) 46 | (add-hook 'caml-mode-hook 'merlin-mode t) 47 | ;; Use opam switch to lookup ocamlmerlin binary 48 | (setq merlin-command 'opam))) 49 | 50 | Take a look at https://github.com/ocaml/merlin for more information 51 | 52 | Quick setup with opam-user-setup 53 | -------------------------------- 54 | 55 | Opam-user-setup support Merlin. 56 | 57 | $ opam user-setup install 58 | 59 | should take care of basic setup. 60 | See https://github.com/OCamlPro/opam-user-setup 61 | " 62 | {success & !user-setup:installed} 63 | ] 64 | url { 65 | src: 66 | "https://github.com/ocaml/merlin/releases/download/v3.3.3/merlin-v3.3.3.tbz" 67 | checksum: [ 68 | "sha256=72909ef47eea1f6fca13b4109a34dccf8fe3923a3c026f1ed1db9eb5ee9aae15" 69 | "sha512=2a5f39d966be56c1322982effc05bc98fd5f66cd12f1f76953f8daa9eca74a58c92a186854f4e601e2f0bb038720691446e7591b4613982accded3e579fedb23" 70 | ] 71 | } 72 | -------------------------------------------------------------------------------- /esy.lock/opam/ocaml-migrate-parsetree.1.5.0/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "frederic.bour@lakaban.net" 3 | authors: [ 4 | "Frédéric Bour " 5 | "Jérémie Dimino " 6 | ] 7 | license: "LGPL-2.1 with OCaml linking exception" 8 | homepage: "https://github.com/ocaml-ppx/ocaml-migrate-parsetree" 9 | bug-reports: "https://github.com/ocaml-ppx/ocaml-migrate-parsetree/issues" 10 | dev-repo: "git+https://github.com/ocaml-ppx/ocaml-migrate-parsetree.git" 11 | doc: "https://ocaml-ppx.github.io/ocaml-migrate-parsetree/" 12 | tags: [ "syntax" "org:ocamllabs" ] 13 | build: [ 14 | ["dune" "build" "-p" name "-j" jobs] 15 | ] 16 | depends: [ 17 | "result" 18 | "ppx_derivers" 19 | "dune" {>= "1.9.0"} 20 | "ocaml" {>= "4.02.3"} 21 | ] 22 | synopsis: "Convert OCaml parsetrees between different versions" 23 | description: """ 24 | Convert OCaml parsetrees between different versions 25 | 26 | This library converts parsetrees, outcometree and ast mappers between 27 | different OCaml versions. High-level functions help making PPX 28 | rewriters independent of a compiler version. 29 | """ 30 | url { 31 | src: 32 | "https://github.com/ocaml-ppx/ocaml-migrate-parsetree/releases/download/v1.5.0/ocaml-migrate-parsetree-v1.5.0.tbz" 33 | checksum: [ 34 | "sha256=7f56679c9561552762666de5b6b81c8e4cc2e9fd92272e2269878a2eb534e3c0" 35 | "sha512=87fdccafae83b0437f1ccd4f3cfbc49e699bc0804596480e0df88510ba33410f31d48c7f677fe72800ed3f442a3a586d82d86aee1d12a964f79892833847b16a" 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /esy.lock/opam/ocamlbuild.0.14.0/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "Gabriel Scherer " 3 | authors: ["Nicolas Pouillard" "Berke Durak"] 4 | homepage: "https://github.com/ocaml/ocamlbuild/" 5 | bug-reports: "https://github.com/ocaml/ocamlbuild/issues" 6 | license: "LGPL-2.1-only with OCaml-LGPL-linking-exception" 7 | doc: "https://github.com/ocaml/ocamlbuild/blob/master/manual/manual.adoc" 8 | dev-repo: "git+https://github.com/ocaml/ocamlbuild.git" 9 | build: [ 10 | [ 11 | make 12 | "-f" 13 | "configure.make" 14 | "all" 15 | "OCAMLBUILD_PREFIX=%{prefix}%" 16 | "OCAMLBUILD_BINDIR=%{bin}%" 17 | "OCAMLBUILD_LIBDIR=%{lib}%" 18 | "OCAMLBUILD_MANDIR=%{man}%" 19 | "OCAML_NATIVE=%{ocaml:native}%" 20 | "OCAML_NATIVE_TOOLS=%{ocaml:native}%" 21 | ] 22 | [make "check-if-preinstalled" "all" "opam-install"] 23 | ] 24 | conflicts: [ 25 | "base-ocamlbuild" 26 | "ocamlfind" {< "1.6.2"} 27 | ] 28 | synopsis: 29 | "OCamlbuild is a build system with builtin rules to easily build most OCaml projects." 30 | depends: [ 31 | "ocaml" {>= "4.03"} 32 | ] 33 | url { 34 | src: "https://github.com/ocaml/ocamlbuild/archive/0.14.0.tar.gz" 35 | checksum: "sha256=87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78" 36 | } 37 | -------------------------------------------------------------------------------- /esy.lock/opam/ocamlfind.1.8.1/files/ocaml-stub: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | BINDIR=$(dirname "$(command -v ocamlc)") 4 | "$BINDIR/ocaml" -I "$OCAML_TOPLEVEL_PATH" "$@" 5 | -------------------------------------------------------------------------------- /esy.lock/opam/ocamlfind.1.8.1/files/ocamlfind.install: -------------------------------------------------------------------------------- 1 | bin: [ 2 | "src/findlib/ocamlfind" {"ocamlfind"} 3 | "?src/findlib/ocamlfind_opt" {"ocamlfind"} 4 | "?tools/safe_camlp4" 5 | ] 6 | toplevel: ["src/findlib/topfind"] 7 | -------------------------------------------------------------------------------- /esy.lock/opam/ocamlfind.1.8.1/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | synopsis: "A library manager for OCaml" 3 | maintainer: "Thomas Gazagnaire " 4 | authors: "Gerd Stolpmann " 5 | homepage: "http://projects.camlcity.org/projects/findlib.html" 6 | bug-reports: "https://gitlab.camlcity.org/gerd/lib-findlib/issues" 7 | dev-repo: "git+https://gitlab.camlcity.org/gerd/lib-findlib.git" 8 | description: """ 9 | Findlib is a library manager for OCaml. It provides a convention how 10 | to store libraries, and a file format ("META") to describe the 11 | properties of libraries. There is also a tool (ocamlfind) for 12 | interpreting the META files, so that it is very easy to use libraries 13 | in programs and scripts. 14 | """ 15 | build: [ 16 | [ 17 | "./configure" 18 | "-bindir" 19 | bin 20 | "-sitelib" 21 | lib 22 | "-mandir" 23 | man 24 | "-config" 25 | "%{lib}%/findlib.conf" 26 | "-no-custom" 27 | "-no-camlp4" {!ocaml:preinstalled & ocaml:version >= "4.02.0"} 28 | "-no-topfind" {ocaml:preinstalled} 29 | ] 30 | [make "all"] 31 | [make "opt"] {ocaml:native} 32 | ] 33 | install: [ 34 | [make "install"] 35 | ["install" "-m" "0755" "ocaml-stub" "%{bin}%/ocaml"] {ocaml:preinstalled} 36 | ] 37 | depends: [ 38 | "ocaml" {>= "4.00.0"} 39 | "conf-m4" {build} 40 | ] 41 | extra-files: [ 42 | ["ocamlfind.install" "md5=06f2c282ab52d93aa6adeeadd82a2543"] 43 | ["ocaml-stub" "md5=181f259c9e0bad9ef523e7d4abfdf87a"] 44 | ] 45 | url { 46 | src: "http://download.camlcity.org/download/findlib-1.8.1.tar.gz" 47 | checksum: "md5=18ca650982c15536616dea0e422cbd8c" 48 | mirrors: "http://download2.camlcity.org/download/findlib-1.8.1.tar.gz" 49 | } 50 | depopts: ["graphics"] 51 | -------------------------------------------------------------------------------- /esy.lock/opam/ppx_derivers.1.2.1/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "jeremie@dimino.org" 3 | authors: ["Jérémie Dimino"] 4 | license: "BSD-3-Clause" 5 | homepage: "https://github.com/ocaml-ppx/ppx_derivers" 6 | bug-reports: "https://github.com/ocaml-ppx/ppx_derivers/issues" 7 | dev-repo: "git://github.com/ocaml-ppx/ppx_derivers.git" 8 | build: [ 9 | ["dune" "build" "-p" name "-j" jobs] 10 | ] 11 | depends: [ 12 | "ocaml" 13 | "dune" 14 | ] 15 | synopsis: "Shared [@@deriving] plugin registry" 16 | description: """ 17 | Ppx_derivers is a tiny package whose sole purpose is to allow 18 | ppx_deriving and ppx_type_conv to inter-operate gracefully when linked 19 | as part of the same ocaml-migrate-parsetree driver.""" 20 | url { 21 | src: "https://github.com/ocaml-ppx/ppx_derivers/archive/1.2.1.tar.gz" 22 | checksum: "md5=5dc2bf130c1db3c731fe0fffc5648b41" 23 | } 24 | -------------------------------------------------------------------------------- /esy.lock/opam/re.1.9.0/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | 3 | maintainer: "rudi.grinberg@gmail.com" 4 | authors: [ 5 | "Jerome Vouillon" 6 | "Thomas Gazagnaire" 7 | "Anil Madhavapeddy" 8 | "Rudi Grinberg" 9 | "Gabriel Radanne" 10 | ] 11 | license: "LGPL-2.0-only with OCaml-LGPL-linking-exception" 12 | homepage: "https://github.com/ocaml/ocaml-re" 13 | bug-reports: "https://github.com/ocaml/ocaml-re/issues" 14 | dev-repo: "git+https://github.com/ocaml/ocaml-re.git" 15 | 16 | build: [ 17 | ["dune" "subst"] {pinned} 18 | ["dune" "build" "-p" name "-j" jobs] 19 | ["dune" "runtest" "-p" name "-j" jobs] {with-test} 20 | ] 21 | 22 | depends: [ 23 | "ocaml" {>= "4.02"} 24 | "dune" 25 | "ounit" {with-test} 26 | "seq" 27 | ] 28 | 29 | synopsis: "RE is a regular expression library for OCaml" 30 | description: """ 31 | Pure OCaml regular expressions with: 32 | * Perl-style regular expressions (module Re.Perl) 33 | * Posix extended regular expressions (module Re.Posix) 34 | * Emacs-style regular expressions (module Re.Emacs) 35 | * Shell-style file globbing (module Re.Glob) 36 | * Compatibility layer for OCaml's built-in Str module (module Re.Str) 37 | """ 38 | url { 39 | src: 40 | "https://github.com/ocaml/ocaml-re/releases/download/1.9.0/re-1.9.0.tbz" 41 | checksum: "md5=bddaed4f386a22cace7850c9c7dac296" 42 | } 43 | -------------------------------------------------------------------------------- /esy.lock/opam/result.1.4/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "opensource@janestreet.com" 3 | authors: ["Jane Street Group, LLC "] 4 | homepage: "https://github.com/janestreet/result" 5 | dev-repo: "git+https://github.com/janestreet/result.git" 6 | bug-reports: "https://github.com/janestreet/result/issues" 7 | license: "BSD-3-Clause" 8 | build: [["dune" "build" "-p" name "-j" jobs]] 9 | depends: [ 10 | "ocaml" 11 | "dune" {>= "1.0"} 12 | ] 13 | synopsis: "Compatibility Result module" 14 | description: """ 15 | Projects that want to use the new result type defined in OCaml >= 4.03 16 | while staying compatible with older version of OCaml should use the 17 | Result module defined in this library.""" 18 | url { 19 | src: 20 | "https://github.com/janestreet/result/archive/1.4.tar.gz" 21 | checksum: "md5=d3162dbc501a2af65c8c71e0866541da" 22 | } 23 | -------------------------------------------------------------------------------- /esy.lock/opam/seq.0.2.2/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | synopsis: 3 | "Compatibility package for OCaml's standard iterator type starting from 4.07" 4 | maintainer: "simon.cruanes.2007@m4x.org" 5 | license: "LGPL2.1" 6 | build: [ 7 | ["dune" "build" "-p" name "-j" jobs] 8 | ] 9 | depends: [ 10 | "dune" {>= "1.1.0"} 11 | "ocaml" 12 | ] 13 | tags: [ "iterator" "seq" "pure" "list" "compatibility" "cascade" ] 14 | homepage: "https://github.com/c-cube/seq/" 15 | bug-reports: "https://github.com/c-cube/seq/issues" 16 | dev-repo: "git+https://github.com/c-cube/seq.git" 17 | authors: "Simon Cruanes" 18 | url { 19 | src: "https://github.com/c-cube/seq/archive/0.2.2.tar.gz" 20 | checksum: [ 21 | "md5=9033e02283aa3bde9f97f24e632902e3" 22 | "sha512=cab0eb4cb6d9788b7cbd7acbefefc15689d706c97ff7f75dd97faf3c21e466af4d0ff110541a24729db587e7172b1a30a3c2967e17ec2e49cbd923360052c07c" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /esy.lock/opam/yojson.1.7.0/opam: -------------------------------------------------------------------------------- 1 | opam-version: "2.0" 2 | maintainer: "martin@mjambon.com" 3 | authors: ["Martin Jambon"] 4 | homepage: "https://github.com/ocaml-community/yojson" 5 | bug-reports: "https://github.com/ocaml-community/yojson/issues" 6 | dev-repo: "git+https://github.com/ocaml-community/yojson.git" 7 | doc: "https://ocaml-community.github.io/yojson/" 8 | build: [ 9 | ["dune" "subst"] {pinned} 10 | ["dune" "build" "-p" name "-j" jobs] 11 | ] 12 | run-test: [["dune" "runtest" "-p" name "-j" jobs]] 13 | depends: [ 14 | "ocaml" {>= "4.02.3"} 15 | "dune" 16 | "cppo" {build} 17 | "easy-format" 18 | "biniou" {>= "1.2.0"} 19 | "alcotest" {with-test & >= "0.8.5"} 20 | ] 21 | synopsis: 22 | "Yojson is an optimized parsing and printing library for the JSON format" 23 | description: """ 24 | Yojson is an optimized parsing and printing library for the JSON format. 25 | 26 | It addresses a few shortcomings of json-wheel including 2x speedup, 27 | polymorphic variants and optional syntax for tuples and variants. 28 | 29 | ydump is a pretty-printing command-line program provided with the 30 | yojson package. 31 | 32 | The program atdgen can be used to derive OCaml-JSON serializers and 33 | deserializers from type definitions.""" 34 | url { 35 | src: 36 | "https://github.com/ocaml-community/yojson/releases/download/1.7.0/yojson-1.7.0.tbz" 37 | checksum: "md5=b89d39ca3f8c532abe5f547ad3b8f84d" 38 | } 39 | -------------------------------------------------------------------------------- /esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/files/ocamlbuild-0.14.0.patch: -------------------------------------------------------------------------------- 1 | --- ./Makefile 2 | +++ ./Makefile 3 | @@ -213,7 +213,7 @@ 4 | rm -f man/ocamlbuild.1 5 | 6 | man/options_man.byte: src/ocamlbuild_pack.cmo 7 | - $(OCAMLC) $^ -I src man/options_man.ml -o man/options_man.byte 8 | + $(OCAMLC) -I +unix unix.cma $^ -I src man/options_man.ml -o man/options_man.byte 9 | 10 | clean:: 11 | rm -f man/options_man.cm* 12 | --- ./src/command.ml 13 | +++ ./src/command.ml 14 | @@ -148,9 +148,10 @@ 15 | let self = string_of_command_spec_with_calls call_with_tags call_with_target resolve_virtuals in 16 | let b = Buffer.create 256 in 17 | (* The best way to prevent bash from switching to its windows-style 18 | - * quote-handling is to prepend an empty string before the command name. *) 19 | + * quote-handling is to prepend an empty string before the command name. 20 | + * space seems to work, too - and the ouput is nicer *) 21 | if Sys.os_type = "Win32" then 22 | - Buffer.add_string b "''"; 23 | + Buffer.add_char b ' '; 24 | let first = ref true in 25 | let put_space () = 26 | if !first then 27 | @@ -260,7 +261,7 @@ 28 | 29 | let execute_many ?(quiet=false) ?(pretend=false) cmds = 30 | add_parallel_stat (List.length cmds); 31 | - let degraded = !*My_unix.is_degraded || Sys.os_type = "Win32" in 32 | + let degraded = !*My_unix.is_degraded in 33 | let jobs = !jobs in 34 | if jobs < 0 then invalid_arg "jobs < 0"; 35 | let max_jobs = if jobs = 0 then None else Some jobs in 36 | --- ./src/findlib.ml 37 | +++ ./src/findlib.ml 38 | @@ -66,9 +66,6 @@ 39 | (fun command -> lexer & Lexing.from_string & run_and_read command) 40 | command 41 | 42 | -let run_and_read command = 43 | - Printf.ksprintf run_and_read command 44 | - 45 | let rec query name = 46 | try 47 | Hashtbl.find packages name 48 | @@ -135,7 +132,8 @@ 49 | with Not_found -> s 50 | 51 | let list () = 52 | - List.map before_space (split_nl & run_and_read "%s list" ocamlfind) 53 | + let cmd = Shell.quote_filename_if_needed ocamlfind ^ " list" in 54 | + List.map before_space (split_nl & run_and_read cmd) 55 | 56 | (* The closure algorithm is easy because the dependencies are already closed 57 | and sorted for each package. We only have to make the union. We could also 58 | --- ./src/main.ml 59 | +++ ./src/main.ml 60 | @@ -162,6 +162,9 @@ 61 | Tags.mem "traverse" tags 62 | || List.exists (Pathname.is_prefix path_name) !Options.include_dirs 63 | || List.exists (Pathname.is_prefix path_name) target_dirs) 64 | + && ((* beware: !Options.build_dir is an absolute directory *) 65 | + Pathname.normalize !Options.build_dir 66 | + <> Pathname.normalize (Pathname.pwd/path_name)) 67 | end 68 | end 69 | end 70 | --- ./src/my_std.ml 71 | +++ ./src/my_std.ml 72 | @@ -271,13 +271,107 @@ 73 | try Array.iter (fun x -> if x = basename then raise Exit) a; false 74 | with Exit -> true 75 | 76 | +let command_plain = function 77 | +| [| |] -> 0 78 | +| margv -> 79 | + let rec waitpid a b = 80 | + match Unix.waitpid a b with 81 | + | exception (Unix.Unix_error(Unix.EINTR,_,_)) -> waitpid a b 82 | + | x -> x 83 | + in 84 | + let pid = Unix.(create_process margv.(0) margv stdin stdout stderr) in 85 | + let pid', process_status = waitpid [] pid in 86 | + assert (pid = pid'); 87 | + match process_status with 88 | + | Unix.WEXITED n -> n 89 | + | Unix.WSIGNALED _ -> 2 (* like OCaml's uncaught exceptions *) 90 | + | Unix.WSTOPPED _ -> 127 91 | + 92 | +(* can't use Lexers because of circular dependency *) 93 | +let split_path_win str = 94 | + let rec aux pos = 95 | + try 96 | + let i = String.index_from str pos ';' in 97 | + let len = i - pos in 98 | + if len = 0 then 99 | + aux (succ i) 100 | + else 101 | + String.sub str pos (i - pos) :: aux (succ i) 102 | + with Not_found | Invalid_argument _ -> 103 | + let len = String.length str - pos in 104 | + if len = 0 then [] else [String.sub str pos len] 105 | + in 106 | + aux 0 107 | + 108 | +let windows_shell = lazy begin 109 | + let rec iter = function 110 | + | [] -> [| "bash.exe" ; "--norc" ; "--noprofile" |] 111 | + | hd::tl -> 112 | + let dash = Filename.concat hd "dash.exe" in 113 | + if Sys.file_exists dash then [|dash|] else 114 | + let bash = Filename.concat hd "bash.exe" in 115 | + if Sys.file_exists bash = false then iter tl else 116 | + (* if sh.exe and bash.exe exist in the same dir, choose sh.exe *) 117 | + let sh = Filename.concat hd "sh.exe" in 118 | + if Sys.file_exists sh then [|sh|] else [|bash ; "--norc" ; "--noprofile"|] 119 | + in 120 | + split_path_win (try Sys.getenv "PATH" with Not_found -> "") |> iter 121 | +end 122 | + 123 | +let prep_windows_cmd cmd = 124 | + (* workaround known ocaml bug, remove later *) 125 | + if String.contains cmd '\t' && String.contains cmd ' ' = false then 126 | + " " ^ cmd 127 | + else 128 | + cmd 129 | + 130 | +let run_with_shell = function 131 | +| "" -> 0 132 | +| cmd -> 133 | + let cmd = prep_windows_cmd cmd in 134 | + let shell = Lazy.force windows_shell in 135 | + let qlen = Filename.quote cmd |> String.length in 136 | + (* old versions of dash had problems with bs *) 137 | + try 138 | + if qlen < 7_900 then 139 | + command_plain (Array.append shell [| "-ec" ; cmd |]) 140 | + else begin 141 | + (* it can still work, if the called command is a cygwin tool *) 142 | + let ch_closed = ref false in 143 | + let file_deleted = ref false in 144 | + let fln,ch = 145 | + Filename.open_temp_file 146 | + ~mode:[Open_binary] 147 | + "ocamlbuildtmp" 148 | + ".sh" 149 | + in 150 | + try 151 | + let f_slash = String.map ( fun x -> if x = '\\' then '/' else x ) fln in 152 | + output_string ch cmd; 153 | + ch_closed:= true; 154 | + close_out ch; 155 | + let ret = command_plain (Array.append shell [| "-e" ; f_slash |]) in 156 | + file_deleted:= true; 157 | + Sys.remove fln; 158 | + ret 159 | + with 160 | + | x -> 161 | + if !ch_closed = false then 162 | + close_out_noerr ch; 163 | + if !file_deleted = false then 164 | + (try Sys.remove fln with _ -> ()); 165 | + raise x 166 | + end 167 | + with 168 | + | (Unix.Unix_error _) as x -> 169 | + (* Sys.command doesn't raise an exception, so run_with_shell also won't 170 | + raise *) 171 | + Printexc.to_string x ^ ":" ^ cmd |> prerr_endline; 172 | + 1 173 | + 174 | let sys_command = 175 | - match Sys.os_type with 176 | - | "Win32" -> fun cmd -> 177 | - if cmd = "" then 0 else 178 | - let cmd = "bash --norc -c " ^ Filename.quote cmd in 179 | - Sys.command cmd 180 | - | _ -> fun cmd -> if cmd = "" then 0 else Sys.command cmd 181 | + if Sys.win32 then run_with_shell 182 | + else fun cmd -> if cmd = "" then 0 else Sys.command cmd 183 | 184 | (* FIXME warning fix and use Filename.concat *) 185 | let filename_concat x y = 186 | --- ./src/my_std.mli 187 | +++ ./src/my_std.mli 188 | @@ -69,3 +69,6 @@ 189 | 190 | val split_ocaml_version : (int * int * int * string) option 191 | (** (major, minor, patchlevel, rest) *) 192 | + 193 | +val windows_shell : string array Lazy.t 194 | +val prep_windows_cmd : string -> string 195 | --- ./src/ocamlbuild_executor.ml 196 | +++ ./src/ocamlbuild_executor.ml 197 | @@ -34,6 +34,8 @@ 198 | job_stdin : out_channel; 199 | job_stderr : in_channel; 200 | job_buffer : Buffer.t; 201 | + job_pid : int; 202 | + job_tmp_file: string option; 203 | mutable job_dying : bool; 204 | };; 205 | 206 | @@ -76,6 +78,61 @@ 207 | in 208 | loop 0 209 | ;; 210 | + 211 | +let open_process_full_win cmd env = 212 | + let (in_read, in_write) = Unix.pipe () in 213 | + let (out_read, out_write) = Unix.pipe () in 214 | + let (err_read, err_write) = Unix.pipe () in 215 | + Unix.set_close_on_exec in_read; 216 | + Unix.set_close_on_exec out_write; 217 | + Unix.set_close_on_exec err_read; 218 | + let inchan = Unix.in_channel_of_descr in_read in 219 | + let outchan = Unix.out_channel_of_descr out_write in 220 | + let errchan = Unix.in_channel_of_descr err_read in 221 | + let shell = Lazy.force Ocamlbuild_pack.My_std.windows_shell in 222 | + let test_cmd = 223 | + String.concat " " (List.map Filename.quote (Array.to_list shell)) ^ 224 | + "-ec " ^ 225 | + Filename.quote (Ocamlbuild_pack.My_std.prep_windows_cmd cmd) in 226 | + let argv,tmp_file = 227 | + if String.length test_cmd < 7_900 then 228 | + Array.append 229 | + shell 230 | + [| "-ec" ; Ocamlbuild_pack.My_std.prep_windows_cmd cmd |],None 231 | + else 232 | + let fln,ch = Filename.open_temp_file ~mode:[Open_binary] "ocamlbuild" ".sh" in 233 | + output_string ch (Ocamlbuild_pack.My_std.prep_windows_cmd cmd); 234 | + close_out ch; 235 | + let fln' = String.map (function '\\' -> '/' | c -> c) fln in 236 | + Array.append 237 | + shell 238 | + [| "-c" ; fln' |], Some fln in 239 | + let pid = 240 | + Unix.create_process_env argv.(0) argv env out_read in_write err_write in 241 | + Unix.close out_read; 242 | + Unix.close in_write; 243 | + Unix.close err_write; 244 | + (pid, inchan, outchan, errchan,tmp_file) 245 | + 246 | +let close_process_full_win (pid,inchan, outchan, errchan, tmp_file) = 247 | + let delete tmp_file = 248 | + match tmp_file with 249 | + | None -> () 250 | + | Some x -> try Sys.remove x with Sys_error _ -> () in 251 | + let tmp_file_deleted = ref false in 252 | + try 253 | + close_in inchan; 254 | + close_out outchan; 255 | + close_in errchan; 256 | + let res = snd(Unix.waitpid [] pid) in 257 | + tmp_file_deleted := true; 258 | + delete tmp_file; 259 | + res 260 | + with 261 | + | x when tmp_file <> None && !tmp_file_deleted = false -> 262 | + delete tmp_file; 263 | + raise x 264 | + 265 | (* ***) 266 | (*** execute *) 267 | (* XXX: Add test for non reentrancy *) 268 | @@ -130,10 +187,16 @@ 269 | (*** add_job *) 270 | let add_job cmd rest result id = 271 | (*display begin fun oc -> fp oc "Job %a is %s\n%!" print_job_id id cmd; end;*) 272 | - let (stdout', stdin', stderr') = open_process_full cmd env in 273 | + let (pid,stdout', stdin', stderr', tmp_file) = 274 | + if Sys.win32 then open_process_full_win cmd env else 275 | + let a,b,c = open_process_full cmd env in 276 | + -1,a,b,c,None 277 | + in 278 | incr jobs_active; 279 | - set_nonblock (doi stdout'); 280 | - set_nonblock (doi stderr'); 281 | + if not Sys.win32 then ( 282 | + set_nonblock (doi stdout'); 283 | + set_nonblock (doi stderr'); 284 | + ); 285 | let job = 286 | { job_id = id; 287 | job_command = cmd; 288 | @@ -143,7 +206,9 @@ 289 | job_stdin = stdin'; 290 | job_stderr = stderr'; 291 | job_buffer = Buffer.create 1024; 292 | - job_dying = false } 293 | + job_dying = false; 294 | + job_tmp_file = tmp_file; 295 | + job_pid = pid } 296 | in 297 | outputs := FDM.add (doi stdout') job (FDM.add (doi stderr') job !outputs); 298 | jobs := JS.add job !jobs; 299 | @@ -199,6 +264,7 @@ 300 | try 301 | read fd u 0 (Bytes.length u) 302 | with 303 | + | Unix.Unix_error(Unix.EPIPE,_,_) when Sys.win32 -> 0 304 | | Unix.Unix_error(e,_,_) -> 305 | let msg = error_message e in 306 | display (fun oc -> fp oc 307 | @@ -241,14 +307,19 @@ 308 | decr jobs_active; 309 | 310 | (* PR#5371: we would get EAGAIN below otherwise *) 311 | - clear_nonblock (doi job.job_stdout); 312 | - clear_nonblock (doi job.job_stderr); 313 | - 314 | + if not Sys.win32 then ( 315 | + clear_nonblock (doi job.job_stdout); 316 | + clear_nonblock (doi job.job_stderr); 317 | + ); 318 | do_read ~loop:true (doi job.job_stdout) job; 319 | do_read ~loop:true (doi job.job_stderr) job; 320 | outputs := FDM.remove (doi job.job_stdout) (FDM.remove (doi job.job_stderr) !outputs); 321 | jobs := JS.remove job !jobs; 322 | - let status = close_process_full (job.job_stdout, job.job_stdin, job.job_stderr) in 323 | + let status = 324 | + if Sys.win32 then 325 | + close_process_full_win (job.job_pid, job.job_stdout, job.job_stdin, job.job_stderr, job.job_tmp_file) 326 | + else 327 | + close_process_full (job.job_stdout, job.job_stdin, job.job_stderr) in 328 | 329 | let shown = ref false in 330 | 331 | --- ./src/ocamlbuild_unix_plugin.ml 332 | +++ ./src/ocamlbuild_unix_plugin.ml 333 | @@ -48,12 +48,22 @@ 334 | end 335 | 336 | let run_and_open s kont = 337 | + let s_orig = s in 338 | + let s = 339 | + (* Be consistent! My_unix.run_and_open uses My_std.sys_command and 340 | + sys_command uses bash. *) 341 | + if Sys.win32 = false then s else 342 | + let l = match Lazy.force My_std.windows_shell |> Array.to_list with 343 | + | hd::tl -> (Filename.quote hd)::tl 344 | + | _ -> assert false in 345 | + "\"" ^ (String.concat " " l) ^ " -ec " ^ Filename.quote (" " ^ s) ^ "\"" 346 | + in 347 | let ic = Unix.open_process_in s in 348 | let close () = 349 | match Unix.close_process_in ic with 350 | | Unix.WEXITED 0 -> () 351 | | Unix.WEXITED _ | Unix.WSIGNALED _ | Unix.WSTOPPED _ -> 352 | - failwith (Printf.sprintf "Error while running: %s" s) in 353 | + failwith (Printf.sprintf "Error while running: %s" s_orig) in 354 | let res = try 355 | kont ic 356 | with e -> (close (); raise e) 357 | --- ./src/options.ml 358 | +++ ./src/options.ml 359 | @@ -174,11 +174,24 @@ 360 | build_dir := Filename.concat (Sys.getcwd ()) s 361 | else 362 | build_dir := s 363 | + 364 | +let slashify = 365 | + if Sys.win32 then fun p -> String.map (function '\\' -> '/' | x -> x) p 366 | + else fun p ->p 367 | + 368 | +let sb () = 369 | + match Sys.os_type with 370 | + | "Win32" -> 371 | + (try set_binary_mode_out stdout true with _ -> ()); 372 | + | _ -> () 373 | + 374 | + 375 | let spec = ref ( 376 | let print_version () = 377 | + sb (); 378 | Printf.printf "ocamlbuild %s\n%!" Ocamlbuild_config.version; raise Exit_OK 379 | in 380 | - let print_vnum () = print_endline Ocamlbuild_config.version; raise Exit_OK in 381 | + let print_vnum () = sb (); print_endline Ocamlbuild_config.version; raise Exit_OK in 382 | Arg.align 383 | [ 384 | "-version", Unit print_version , " Display the version"; 385 | @@ -257,8 +270,8 @@ 386 | "-build-dir", String set_build_dir, " Set build directory (implies no-links)"; 387 | "-install-lib-dir", Set_string Ocamlbuild_where.libdir, " Set the install library directory"; 388 | "-install-bin-dir", Set_string Ocamlbuild_where.bindir, " Set the install binary directory"; 389 | - "-where", Unit (fun () -> print_endline !Ocamlbuild_where.libdir; raise Exit_OK), " Display the install library directory"; 390 | - "-which", String (fun cmd -> print_endline (find_tool cmd); raise Exit_OK), " Display path to the tool command"; 391 | + "-where", Unit (fun () -> sb (); print_endline (slashify !Ocamlbuild_where.libdir); raise Exit_OK), " Display the install library directory"; 392 | + "-which", String (fun cmd -> sb (); print_endline (slashify (find_tool cmd)); raise Exit_OK), " Display path to the tool command"; 393 | "-ocamlc", set_cmd ocamlc, " Set the OCaml bytecode compiler"; 394 | "-plugin-ocamlc", set_cmd plugin_ocamlc, " Set the OCaml bytecode compiler \ 395 | used when building myocamlbuild.ml (only)"; 396 | --- ./src/pathname.ml 397 | +++ ./src/pathname.ml 398 | @@ -84,6 +84,26 @@ 399 | | x :: xs -> x :: normalize_list xs 400 | 401 | let normalize x = 402 | + let x = 403 | + if Sys.win32 = false then 404 | + x 405 | + else 406 | + let len = String.length x in 407 | + let b = Bytes.create len in 408 | + for i = 0 to pred len do 409 | + match x.[i] with 410 | + | '\\' -> Bytes.set b i '/' 411 | + | c -> Bytes.set b i c 412 | + done; 413 | + if len > 1 then ( 414 | + let c1 = Bytes.get b 0 in 415 | + let c2 = Bytes.get b 1 in 416 | + if c2 = ':' && c1 >= 'a' && c1 <= 'z' && 417 | + ( len = 2 || Bytes.get b 2 = '/') then 418 | + Bytes.set b 0 (Char.uppercase_ascii c1) 419 | + ); 420 | + Bytes.unsafe_to_string b 421 | + in 422 | if Glob.eval not_normal_form_re x then 423 | let root, paths = split x in 424 | join root (normalize_list paths) 425 | --- ./src/shell.ml 426 | +++ ./src/shell.ml 427 | @@ -24,12 +24,26 @@ 428 | | 'a'..'z' | 'A'..'Z' | '0'..'9' | '.' | '-' | '/' | '_' | ':' | '@' | '+' | ',' -> loop (pos + 1) 429 | | _ -> false in 430 | loop 0 431 | + 432 | +let generic_quote quotequote s = 433 | + let l = String.length s in 434 | + let b = Buffer.create (l + 20) in 435 | + Buffer.add_char b '\''; 436 | + for i = 0 to l - 1 do 437 | + if s.[i] = '\'' 438 | + then Buffer.add_string b quotequote 439 | + else Buffer.add_char b s.[i] 440 | + done; 441 | + Buffer.add_char b '\''; 442 | + Buffer.contents b 443 | +let unix_quote = generic_quote "'\\''" 444 | + 445 | let quote_filename_if_needed s = 446 | if is_simple_filename s then s 447 | (* We should probably be using [Filename.unix_quote] except that function 448 | * isn't exported. Users on Windows will have to live with not being able to 449 | * install OCaml into c:\o'caml. Too bad. *) 450 | - else if Sys.os_type = "Win32" then Printf.sprintf "'%s'" s 451 | + else if Sys.os_type = "Win32" then unix_quote s 452 | else Filename.quote s 453 | let chdir dir = 454 | reset_filesys_cache (); 455 | @@ -37,7 +51,7 @@ 456 | let run args target = 457 | reset_readdir_cache (); 458 | let cmd = String.concat " " (List.map quote_filename_if_needed args) in 459 | - if !*My_unix.is_degraded || Sys.os_type = "Win32" then 460 | + if !*My_unix.is_degraded then 461 | begin 462 | Log.event cmd target Tags.empty; 463 | let st = sys_command cmd in 464 | -------------------------------------------------------------------------------- /esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": [ 3 | [ 4 | "bash", 5 | "-c", 6 | "#{os == 'windows' ? 'patch -p1 < ocamlbuild-0.14.0.patch' : 'true'}" 7 | ], 8 | [ 9 | "make", 10 | "-f", 11 | "configure.make", 12 | "all", 13 | "OCAMLBUILD_PREFIX=#{self.install}", 14 | "OCAMLBUILD_BINDIR=#{self.bin}", 15 | "OCAMLBUILD_LIBDIR=#{self.lib}", 16 | "OCAMLBUILD_MANDIR=#{self.man}", 17 | "OCAMLBUILD_NATIVE=true", 18 | "OCAMLBUILD_NATIVE_TOOLS=true" 19 | ], 20 | [ 21 | "make", 22 | "check-if-preinstalled", 23 | "all", 24 | "#{os == 'windows' ? 'install' : 'opam-install'}" 25 | ] 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/files/findlib-1.8.1.patch: -------------------------------------------------------------------------------- 1 | --- ./Makefile 2 | +++ ./Makefile 3 | @@ -57,16 +57,16 @@ 4 | cat findlib.conf.in | \ 5 | $(SH) tools/patch '@SITELIB@' '$(OCAML_SITELIB)' >findlib.conf 6 | if ./tools/cmd_from_same_dir ocamlc; then \ 7 | - echo 'ocamlc="ocamlc.opt"' >>findlib.conf; \ 8 | + echo 'ocamlc="ocamlc.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ 9 | fi 10 | if ./tools/cmd_from_same_dir ocamlopt; then \ 11 | - echo 'ocamlopt="ocamlopt.opt"' >>findlib.conf; \ 12 | + echo 'ocamlopt="ocamlopt.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ 13 | fi 14 | if ./tools/cmd_from_same_dir ocamldep; then \ 15 | - echo 'ocamldep="ocamldep.opt"' >>findlib.conf; \ 16 | + echo 'ocamldep="ocamldep.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ 17 | fi 18 | if ./tools/cmd_from_same_dir ocamldoc; then \ 19 | - echo 'ocamldoc="ocamldoc.opt"' >>findlib.conf; \ 20 | + echo 'ocamldoc="ocamldoc.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ 21 | fi 22 | 23 | .PHONY: install-doc 24 | --- ./src/findlib/findlib_config.mlp 25 | +++ ./src/findlib/findlib_config.mlp 26 | @@ -24,3 +24,5 @@ 27 | | "MacOS" -> "" (* don't know *) 28 | | _ -> failwith "Unknown Sys.os_type" 29 | ;; 30 | + 31 | +let exec_suffix = "@EXEC_SUFFIX@";; 32 | --- ./src/findlib/findlib.ml 33 | +++ ./src/findlib/findlib.ml 34 | @@ -28,15 +28,20 @@ 35 | let conf_ldconf = ref "";; 36 | let conf_ignore_dups_in = ref ([] : string list);; 37 | 38 | -let ocamlc_default = "ocamlc";; 39 | -let ocamlopt_default = "ocamlopt";; 40 | -let ocamlcp_default = "ocamlcp";; 41 | -let ocamloptp_default = "ocamloptp";; 42 | -let ocamlmklib_default = "ocamlmklib";; 43 | -let ocamlmktop_default = "ocamlmktop";; 44 | -let ocamldep_default = "ocamldep";; 45 | -let ocamlbrowser_default = "ocamlbrowser";; 46 | -let ocamldoc_default = "ocamldoc";; 47 | +let add_exec str = 48 | + match Findlib_config.exec_suffix with 49 | + | "" -> str 50 | + | a -> str ^ a ;; 51 | +let ocamlc_default = add_exec "ocamlc";; 52 | +let ocamlopt_default = add_exec "ocamlopt";; 53 | +let ocamlcp_default = add_exec "ocamlcp";; 54 | +let ocamloptp_default = add_exec "ocamloptp";; 55 | +let ocamlmklib_default = add_exec "ocamlmklib";; 56 | +let ocamlmktop_default = add_exec "ocamlmktop";; 57 | +let ocamldep_default = add_exec "ocamldep";; 58 | +let ocamlbrowser_default = add_exec "ocamlbrowser";; 59 | +let ocamldoc_default = add_exec "ocamldoc";; 60 | + 61 | 62 | 63 | let init_manually 64 | --- ./src/findlib/fl_package_base.ml 65 | +++ ./src/findlib/fl_package_base.ml 66 | @@ -133,7 +133,15 @@ 67 | List.find (fun def -> def.def_var = "exists_if") p.package_defs in 68 | let files = Fl_split.in_words def.def_value in 69 | List.exists 70 | - (fun file -> Sys.file_exists (Filename.concat d' file)) 71 | + (fun file -> 72 | + let fln = Filename.concat d' file in 73 | + let e = Sys.file_exists fln in 74 | + (* necessary for ppx executables *) 75 | + if e || Sys.os_type <> "Win32" || Filename.check_suffix fln ".exe" then 76 | + e 77 | + else 78 | + Sys.file_exists (fln ^ ".exe") 79 | + ) 80 | files 81 | with Not_found -> true in 82 | 83 | --- ./src/findlib/fl_split.ml 84 | +++ ./src/findlib/fl_split.ml 85 | @@ -126,10 +126,17 @@ 86 | | '/' | '\\' -> true 87 | | _ -> false in 88 | let norm_dir_win() = 89 | - if l >= 1 && s.[0] = '/' then 90 | - Buffer.add_char b '\\' else Buffer.add_char b s.[0]; 91 | - if l >= 2 && s.[1] = '/' then 92 | - Buffer.add_char b '\\' else Buffer.add_char b s.[1]; 93 | + if l >= 1 then ( 94 | + if s.[0] = '/' then 95 | + Buffer.add_char b '\\' 96 | + else 97 | + Buffer.add_char b s.[0] ; 98 | + if l >= 2 then 99 | + if s.[1] = '/' then 100 | + Buffer.add_char b '\\' 101 | + else 102 | + Buffer.add_char b s.[1]; 103 | + ); 104 | for k = 2 to l - 1 do 105 | let c = s.[k] in 106 | if is_slash c then ( 107 | --- ./src/findlib/frontend.ml 108 | +++ ./src/findlib/frontend.ml 109 | @@ -31,10 +31,18 @@ 110 | else 111 | Sys_error (arg ^ ": " ^ Unix.error_message code) 112 | 113 | +let is_win = Sys.os_type = "Win32" 114 | + 115 | +let () = 116 | + match Findlib_config.system with 117 | + | "win32" | "win64" | "mingw" | "cygwin" | "mingw64" | "cygwin64" -> 118 | + (try set_binary_mode_out stdout true with _ -> ()); 119 | + (try set_binary_mode_out stderr true with _ -> ()); 120 | + | _ -> () 121 | 122 | let slashify s = 123 | match Findlib_config.system with 124 | - | "mingw" | "mingw64" | "cygwin" -> 125 | + | "win32" | "win64" | "mingw" | "cygwin" | "mingw64" | "cygwin64" -> 126 | let b = Buffer.create 80 in 127 | String.iter 128 | (function 129 | @@ -49,7 +57,7 @@ 130 | 131 | let out_path ?(prefix="") s = 132 | match Findlib_config.system with 133 | - | "mingw" | "mingw64" | "cygwin" -> 134 | + | "win32" | "win64" | "mingw" | "mingw64" | "cygwin" -> 135 | let u = slashify s in 136 | prefix ^ 137 | (if String.contains u ' ' then 138 | @@ -273,11 +281,9 @@ 139 | 140 | 141 | let identify_dir d = 142 | - match Sys.os_type with 143 | - | "Win32" -> 144 | - failwith "identify_dir" (* not available *) 145 | - | _ -> 146 | - let s = Unix.stat d in 147 | + if is_win then 148 | + failwith "identify_dir"; (* not available *) 149 | + let s = Unix.stat d in 150 | (s.Unix.st_dev, s.Unix.st_ino) 151 | ;; 152 | 153 | @@ -459,6 +465,96 @@ 154 | ) 155 | packages 156 | 157 | +let rewrite_cmd s = 158 | + if s = "" || not is_win then 159 | + s 160 | + else 161 | + let s = 162 | + let l = String.length s in 163 | + let b = Buffer.create l in 164 | + for i = 0 to pred l do 165 | + match s.[i] with 166 | + | '/' -> Buffer.add_char b '\\' 167 | + | x -> Buffer.add_char b x 168 | + done; 169 | + Buffer.contents b 170 | + in 171 | + if (Filename.is_implicit s && String.contains s '\\' = false) || 172 | + Filename.check_suffix (String.lowercase s) ".exe" then 173 | + s 174 | + else 175 | + let s' = s ^ ".exe" in 176 | + if Sys.file_exists s' then 177 | + s' 178 | + else 179 | + s 180 | + 181 | +let rewrite_cmd s = 182 | + if s = "" || not is_win then s else 183 | + let s = 184 | + let l = String.length s in 185 | + let b = Buffer.create l in 186 | + for i = 0 to pred l do 187 | + match s.[i] with 188 | + | '/' -> Buffer.add_char b '\\' 189 | + | x -> Buffer.add_char b x 190 | + done; 191 | + Buffer.contents b 192 | + in 193 | + if (Filename.is_implicit s && String.contains s '\\' = false) || 194 | + Filename.check_suffix (String.lowercase s) ".exe" then 195 | + s 196 | + else 197 | + let s' = s ^ ".exe" in 198 | + if Sys.file_exists s' then 199 | + s' 200 | + else 201 | + s 202 | + 203 | +let rewrite_pp cmd = 204 | + if not is_win then cmd else 205 | + let module T = struct exception Keep end in 206 | + let is_whitespace = function 207 | + | ' ' | '\011' | '\012' | '\n' | '\r' | '\t' -> true 208 | + | _ -> false in 209 | + (* characters that triggers special behaviour (cmd.exe, not unix shell) *) 210 | + let is_unsafe_char = function 211 | + | '(' | ')' | '%' | '!' | '^' | '<' | '>' | '&' -> true 212 | + | _ -> false in 213 | + let len = String.length cmd in 214 | + let buf = Buffer.create (len + 4) in 215 | + let buf_cmd = Buffer.create len in 216 | + let rec iter_ws i = 217 | + if i >= len then () else 218 | + let cur = cmd.[i] in 219 | + if is_whitespace cur then ( 220 | + Buffer.add_char buf cur; 221 | + iter_ws (succ i) 222 | + ) 223 | + else 224 | + iter_cmd i 225 | + and iter_cmd i = 226 | + if i >= len then add_buf_cmd () else 227 | + let cur = cmd.[i] in 228 | + if is_unsafe_char cur || cur = '"' || cur = '\'' then 229 | + raise T.Keep; 230 | + if is_whitespace cur then ( 231 | + add_buf_cmd (); 232 | + Buffer.add_substring buf cmd i (len - i) 233 | + ) 234 | + else ( 235 | + Buffer.add_char buf_cmd cur; 236 | + iter_cmd (succ i) 237 | + ) 238 | + and add_buf_cmd () = 239 | + if Buffer.length buf_cmd > 0 then 240 | + Buffer.add_string buf (rewrite_cmd (Buffer.contents buf_cmd)) 241 | + in 242 | + try 243 | + iter_ws 0; 244 | + Buffer.contents buf 245 | + with 246 | + | T.Keep -> cmd 247 | 248 | let process_pp_spec syntax_preds packages pp_opts = 249 | (* Returns: pp_command *) 250 | @@ -549,7 +645,7 @@ 251 | None -> [] 252 | | Some cmd -> 253 | ["-pp"; 254 | - cmd ^ " " ^ 255 | + (rewrite_cmd cmd) ^ " " ^ 256 | String.concat " " (List.map Filename.quote pp_i_options) ^ " " ^ 257 | String.concat " " (List.map Filename.quote pp_archives) ^ " " ^ 258 | String.concat " " (List.map Filename.quote pp_opts)] 259 | @@ -625,9 +721,11 @@ 260 | in 261 | try 262 | let preprocessor = 263 | + rewrite_cmd ( 264 | resolve_path 265 | ~base ~explicit:true 266 | - (package_property predicates pname "ppx") in 267 | + (package_property predicates pname "ppx") ) 268 | + in 269 | ["-ppx"; String.concat " " (preprocessor :: options)] 270 | with Not_found -> [] 271 | ) 272 | @@ -895,6 +993,14 @@ 273 | switch (e.g. -L instead of -L ) 274 | *) 275 | 276 | +(* We may need to remove files on which we do not have complete control. 277 | + On Windows, removing a read-only file fails so try to change the 278 | + mode of the file first. *) 279 | +let remove_file fname = 280 | + try Sys.remove fname 281 | + with Sys_error _ when is_win -> 282 | + (try Unix.chmod fname 0o666 with Unix.Unix_error _ -> ()); 283 | + Sys.remove fname 284 | 285 | let ocamlc which () = 286 | 287 | @@ -1022,9 +1128,12 @@ 288 | 289 | "-intf", 290 | Arg.String (fun s -> pass_files := !pass_files @ [ Intf(slashify s) ]); 291 | - 292 | + 293 | "-pp", 294 | - Arg.String (fun s -> pp_specified := true; add_spec_fn "-pp" s); 295 | + Arg.String (fun s -> pp_specified := true; add_spec_fn "-pp" (rewrite_pp s)); 296 | + 297 | + "-ppx", 298 | + Arg.String (fun s -> add_spec_fn "-ppx" (rewrite_pp s)); 299 | 300 | "-thread", 301 | Arg.Unit (fun _ -> threads := threads_default); 302 | @@ -1237,7 +1346,7 @@ 303 | with 304 | any -> 305 | close_out initl; 306 | - Sys.remove initl_file_name; 307 | + remove_file initl_file_name; 308 | raise any 309 | end; 310 | 311 | @@ -1245,9 +1354,9 @@ 312 | at_exit 313 | (fun () -> 314 | let tr f x = try f x with _ -> () in 315 | - tr Sys.remove initl_file_name; 316 | - tr Sys.remove (Filename.chop_extension initl_file_name ^ ".cmi"); 317 | - tr Sys.remove (Filename.chop_extension initl_file_name ^ ".cmo"); 318 | + tr remove_file initl_file_name; 319 | + tr remove_file (Filename.chop_extension initl_file_name ^ ".cmi"); 320 | + tr remove_file (Filename.chop_extension initl_file_name ^ ".cmo"); 321 | ); 322 | 323 | let exclude_list = [ stdlibdir; threads_dir; vmthreads_dir ] in 324 | @@ -1493,7 +1602,9 @@ 325 | [ "-v", Arg.Unit (fun () -> verbose := Verbose); 326 | "-pp", Arg.String (fun s -> 327 | pp_specified := true; 328 | - options := !options @ ["-pp"; s]); 329 | + options := !options @ ["-pp"; rewrite_pp s]); 330 | + "-ppx", Arg.String (fun s -> 331 | + options := !options @ ["-ppx"; rewrite_pp s]); 332 | ] 333 | ) 334 | ) 335 | @@ -1672,7 +1783,9 @@ 336 | Arg.String (fun s -> add_spec_fn "-I" (slashify (resolve_path s))); 337 | 338 | "-pp", Arg.String (fun s -> pp_specified := true; 339 | - add_spec_fn "-pp" s); 340 | + add_spec_fn "-pp" (rewrite_pp s)); 341 | + "-ppx", Arg.String (fun s -> add_spec_fn "-ppx" (rewrite_pp s)); 342 | + 343 | ] 344 | ) 345 | ) 346 | @@ -1830,7 +1943,10 @@ 347 | output_string ch_out append; 348 | close_out ch_out; 349 | close_in ch_in; 350 | - Unix.utimes outpath s.Unix.st_mtime s.Unix.st_mtime; 351 | + (try Unix.utimes outpath s.Unix.st_mtime s.Unix.st_mtime 352 | + with Unix.Unix_error(e,_,_) -> 353 | + prerr_endline("Warning: setting utimes for " ^ outpath 354 | + ^ ": " ^ Unix.error_message e)); 355 | 356 | prerr_endline("Installed " ^ outpath); 357 | with 358 | @@ -1882,6 +1998,8 @@ 359 | Unix.openfile (Filename.concat dir owner_file) [Unix.O_RDONLY] 0 in 360 | let f = 361 | Unix.in_channel_of_descr fd in 362 | + if is_win then 363 | + set_binary_mode_in f false; 364 | try 365 | let line = input_line f in 366 | let is_my_file = (line = pkg) in 367 | @@ -2208,7 +2326,7 @@ 368 | let lines = read_ldconf !ldconf in 369 | let dlldir_norm = Fl_split.norm_dir dlldir in 370 | let dlldir_norm_lc = string_lowercase_ascii dlldir_norm in 371 | - let ci_filesys = (Sys.os_type = "Win32") in 372 | + let ci_filesys = is_win in 373 | let check_dir d = 374 | let d' = Fl_split.norm_dir d in 375 | (d' = dlldir_norm) || 376 | @@ -2356,7 +2474,7 @@ 377 | List.iter 378 | (fun file -> 379 | let absfile = Filename.concat dlldir file in 380 | - Sys.remove absfile; 381 | + remove_file absfile; 382 | prerr_endline ("Removed " ^ absfile) 383 | ) 384 | dll_files 385 | @@ -2365,7 +2483,7 @@ 386 | (* Remove the files from the package directory: *) 387 | if Sys.file_exists pkgdir then begin 388 | let files = Sys.readdir pkgdir in 389 | - Array.iter (fun f -> Sys.remove (Filename.concat pkgdir f)) files; 390 | + Array.iter (fun f -> remove_file (Filename.concat pkgdir f)) files; 391 | Unix.rmdir pkgdir; 392 | prerr_endline ("Removed " ^ pkgdir) 393 | end 394 | @@ -2415,7 +2533,9 @@ 395 | 396 | 397 | let print_configuration() = 398 | + let sl = slashify in 399 | let dir s = 400 | + let s = sl s in 401 | if Sys.file_exists s then 402 | s 403 | else 404 | @@ -2453,27 +2573,27 @@ 405 | if md = "" then "the corresponding package directories" else dir md 406 | ); 407 | Printf.printf "The standard library is assumed to reside in:\n %s\n" 408 | - (Findlib.ocaml_stdlib()); 409 | + (sl (Findlib.ocaml_stdlib())); 410 | Printf.printf "The ld.conf file can be found here:\n %s\n" 411 | - (Findlib.ocaml_ldconf()); 412 | + (sl (Findlib.ocaml_ldconf())); 413 | flush stdout 414 | | Some "conf" -> 415 | - print_endline (Findlib.config_file()) 416 | + print_endline (sl (Findlib.config_file())) 417 | | Some "path" -> 418 | - List.iter print_endline (Findlib.search_path()) 419 | + List.iter ( fun x -> print_endline (sl x)) (Findlib.search_path()) 420 | | Some "destdir" -> 421 | - print_endline (Findlib.default_location()) 422 | + print_endline ( sl (Findlib.default_location())) 423 | | Some "metadir" -> 424 | - print_endline (Findlib.meta_directory()) 425 | + print_endline ( sl (Findlib.meta_directory())) 426 | | Some "metapath" -> 427 | let mdir = Findlib.meta_directory() in 428 | let ddir = Findlib.default_location() in 429 | - print_endline 430 | - (if mdir <> "" then mdir ^ "/META.%s" else ddir ^ "/%s/META") 431 | + print_endline ( sl 432 | + (if mdir <> "" then mdir ^ "/META.%s" else ddir ^ "/%s/META")) 433 | | Some "stdlib" -> 434 | - print_endline (Findlib.ocaml_stdlib()) 435 | + print_endline ( sl (Findlib.ocaml_stdlib())) 436 | | Some "ldconf" -> 437 | - print_endline (Findlib.ocaml_ldconf()) 438 | + print_endline ( sl (Findlib.ocaml_ldconf())) 439 | | _ -> 440 | assert false 441 | ;; 442 | @@ -2481,7 +2601,7 @@ 443 | 444 | let ocamlcall pkg cmd = 445 | let dir = package_directory pkg in 446 | - let path = Filename.concat dir cmd in 447 | + let path = rewrite_cmd (Filename.concat dir cmd) in 448 | begin 449 | try Unix.access path [ Unix.X_OK ] 450 | with 451 | @@ -2647,6 +2767,10 @@ 452 | | Sys_error f -> 453 | prerr_endline ("ocamlfind: " ^ f); 454 | exit 2 455 | + | Unix.Unix_error (e, fn, f) -> 456 | + prerr_endline ("ocamlfind: " ^ fn ^ " " ^ f 457 | + ^ ": " ^ Unix.error_message e); 458 | + exit 2 459 | | Findlib.No_such_package(pkg,info) -> 460 | prerr_endline ("ocamlfind: Package `" ^ pkg ^ "' not found" ^ 461 | (if info <> "" then " - " ^ info else "")); 462 | --- ./src/findlib/Makefile 463 | +++ ./src/findlib/Makefile 464 | @@ -90,6 +90,7 @@ 465 | cat findlib_config.mlp | \ 466 | $(SH) $(TOP)/tools/patch '@CONFIGFILE@' '$(OCAMLFIND_CONF)' | \ 467 | $(SH) $(TOP)/tools/patch '@STDLIB@' '$(OCAML_CORE_STDLIB)' | \ 468 | + $(SH) $(TOP)/tools/patch '@EXEC_SUFFIX@' '$(EXEC_SUFFIX)' | \ 469 | sed -e 's;@AUTOLINK@;$(OCAML_AUTOLINK);g' \ 470 | -e 's;@SYSTEM@;$(SYSTEM);g' \ 471 | >findlib_config.ml 472 | -------------------------------------------------------------------------------- /esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": [ 3 | [ 4 | "bash", 5 | "-c", 6 | "#{os == 'windows' ? 'patch -p1 < findlib-1.8.1.patch' : 'true'}" 7 | ], 8 | [ 9 | "./configure", 10 | "-bindir", 11 | "#{self.bin}", 12 | "-sitelib", 13 | "#{self.lib}", 14 | "-mandir", 15 | "#{self.man}", 16 | "-config", 17 | "#{self.lib}/findlib.conf", 18 | "-no-custom", 19 | "-no-topfind" 20 | ], 21 | [ 22 | "make", 23 | "all" 24 | ], 25 | [ 26 | "make", 27 | "opt" 28 | ] 29 | ], 30 | "install": [ 31 | [ 32 | "make", 33 | "install" 34 | ], 35 | [ 36 | "install", 37 | "-m", 38 | "0755", 39 | "ocaml-stub", 40 | "#{self.bin}/ocaml" 41 | ], 42 | [ 43 | "mkdir", 44 | "-p", 45 | "#{self.toplevel}" 46 | ], 47 | [ 48 | "install", 49 | "-m", 50 | "0644", 51 | "src/findlib/topfind", 52 | "#{self.toplevel}/topfind" 53 | ] 54 | ], 55 | "exportedEnv": { 56 | "OCAML_TOPLEVEL_PATH": { 57 | "val": "#{self.toplevel}", 58 | "scope": "global" 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | lib/ 2 | node_modules/ 3 | *.bs.js 4 | *.log 5 | .merlin 6 | package-lock.json 7 | yarn.lock 8 | -------------------------------------------------------------------------------- /example/bsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ppx_example", 3 | "refmt": 3, 4 | "suffix": ".bs.js", 5 | "package-specs": { 6 | "module": "es6", 7 | "in-source": true 8 | }, 9 | "sources": { 10 | "dir": "src", 11 | "subdirs": true 12 | }, 13 | "ppx-flags": ["bs-let/ppx"] 14 | } 15 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ppx_example", 3 | "private": true, 4 | "scripts": { 5 | "build": "bsb -make-world", 6 | "start": "bsb -make-world -w", 7 | "clean": "bsb -clean-world" 8 | }, 9 | "devDependencies": { 10 | "bs-let": "0.1.11", 11 | "bs-platform": "7.0.1" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /example/src/Index.re: -------------------------------------------------------------------------------- 1 | type exampleRecord = { 2 | name: string, 3 | age: int, 4 | }; 5 | 6 | module R = { 7 | let let_ = Belt.Result.map; 8 | }; 9 | 10 | let _ = { 11 | let a = Ok({name: "sal", age: 21}); 12 | let%R b = a; 13 | b.age + 29; 14 | }; 15 | -------------------------------------------------------------------------------- /let_anything_ppx.opam: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bs-let", 3 | "version": "0.1.16", 4 | "description": "A PPX for async/await (and general monadic binding) in ReasonML.", 5 | "repository": "https://github.com/reasonml-labs/bs-let", 6 | "license": "MIT", 7 | "scripts": { 8 | "postinstall": "node ./copyPlatformBinaryInPlace.js" 9 | }, 10 | "publishConfig": { 11 | "access": "public" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/Let_anything.re: -------------------------------------------------------------------------------- 1 | /* 2 | THIS CODE ORIGINALLY WRITTEN BY JARED FORSYTH. MODIFICATIONS PERFORMED BY 3 | ANTONIO MONTEIRO. ADDITIONAL MODIFICATIONS MAY HAVE BEEN PERFORMED BY MURPHY 4 | RANDLE, JOSH ROBERTSON, OR OTHER MEMEBERS OF THE BLOOM BUILT TEAM. 5 | */ 6 | 7 | open Migrate_parsetree; 8 | open Ast_406; 9 | 10 | /* 11 | * https://ocsigen.org/lwt/dev/api/Ppx_lwt 12 | * https://github.com/zepalmer/ocaml-monadic 13 | */ 14 | let fail = (loc, txt) => raise(Location.Error(Location.error(~loc, txt))); 15 | 16 | let rec process_bindings = (bindings, ident) => 17 | Parsetree.( 18 | switch (bindings) { 19 | | [] => assert(false) 20 | | [binding] => (binding.pvb_pat, binding.pvb_expr) 21 | | [binding, ...rest] => 22 | let (pattern, expr) = process_bindings(rest, ident); 23 | ( 24 | Ast_helper.Pat.tuple( 25 | ~loc=binding.pvb_loc, 26 | [binding.pvb_pat, pattern], 27 | ), 28 | Ast_helper.Exp.apply( 29 | ~loc=binding.pvb_loc, 30 | Ast_helper.Exp.ident( 31 | ~loc=binding.pvb_loc, 32 | Location.mkloc(Longident.Ldot(ident, "and_"), binding.pvb_loc), 33 | ), 34 | [(Nolabel, binding.pvb_expr), (Nolabel, expr)], 35 | ), 36 | ); 37 | } 38 | ); 39 | 40 | let parseLongident = txt => { 41 | let parts = Str.split(Str.regexp_string("."), txt); 42 | let rec loop = (current, parts) => 43 | switch (current, parts) { 44 | | (None, []) => assert(false) 45 | | (Some(c), []) => c 46 | | (None, [one, ...more]) => loop(Some(Longident.Lident(one)), more) 47 | | (Some(c), [one, ...more]) => 48 | loop(Some(Longident.Ldot(c, one)), more) 49 | }; 50 | loop(None, parts); 51 | }; 52 | 53 | let mapper = (_config, _cookies) => { 54 | ...Ast_mapper.default_mapper, 55 | /* TODO throw error on structure items */ 56 | expr: (mapper, expr) => 57 | switch (expr.pexp_desc) { 58 | | Pexp_extension(( 59 | {txt, loc}, 60 | PStr([ 61 | { 62 | pstr_desc: 63 | Pstr_eval( 64 | {pexp_loc, pexp_desc: Pexp_try(value, handlers), _}, 65 | _attributes, 66 | ), 67 | _ 68 | }, 69 | ]), 70 | )) => 71 | let ident = parseLongident(txt); 72 | let last = Longident.last(ident); 73 | if (last != String.capitalize_ascii(last)) { 74 | Ast_mapper.default_mapper.expr(mapper, expr); 75 | } else { 76 | let handlerLocStart = List.hd(handlers).pc_lhs.ppat_loc; 77 | let handlerLocEnd = 78 | List.nth(handlers, List.length(handlers) - 1).pc_rhs.pexp_loc; 79 | let handlerLoc = {...handlerLocStart, loc_end: handlerLocEnd.loc_end}; 80 | let try_ = 81 | Ast_helper.Exp.ident( 82 | ~loc=pexp_loc, 83 | Location.mkloc(Longident.Ldot(ident, "try_"), loc), 84 | ); 85 | Ast_helper.Exp.apply( 86 | ~loc, 87 | try_, 88 | [ 89 | (Nolabel, mapper.expr(mapper, value)), 90 | (Nolabel, Ast_helper.Exp.function_(~loc=handlerLoc, handlers)), 91 | ], 92 | ); 93 | }; 94 | | Pexp_extension(( 95 | {txt, loc}, 96 | PStr([ 97 | { 98 | pstr_desc: 99 | Pstr_eval( 100 | {pexp_desc: Pexp_let(Nonrecursive, bindings, continuation), _}, 101 | _attributes, 102 | ), 103 | _ 104 | }, 105 | ]), 106 | )) => 107 | let ident = parseLongident(txt); 108 | let last = Longident.last(ident); 109 | if (last != String.capitalize_ascii(last)) { 110 | Ast_mapper.default_mapper.expr(mapper, expr); 111 | } else { 112 | let (pat, expr) = process_bindings(bindings, ident); 113 | let let_ = 114 | Ast_helper.Exp.ident( 115 | ~loc, 116 | Location.mkloc(Longident.Ldot(ident, "let_"), loc), 117 | ); 118 | Ast_helper.Exp.apply( 119 | ~loc, 120 | let_, 121 | [ 122 | (Nolabel, mapper.expr(mapper, expr)), 123 | ( 124 | Nolabel, 125 | Ast_helper.Exp.fun_( 126 | ~loc, 127 | Nolabel, 128 | None, 129 | pat, 130 | mapper.expr(mapper, continuation), 131 | ), 132 | ), 133 | ], 134 | ); 135 | }; 136 | | _ => Ast_mapper.default_mapper.expr(mapper, expr) 137 | }, 138 | }; 139 | 140 | let () = 141 | Migrate_parsetree.Driver.register( 142 | ~name="let-anything", 143 | ~args=[], 144 | Migrate_parsetree.Versions.ocaml_406, 145 | mapper, 146 | ); 147 | -------------------------------------------------------------------------------- /src/dune: -------------------------------------------------------------------------------- 1 | (library 2 | (name let_anything_lib) 3 | (libraries ocaml-migrate-parsetree str)) 4 | --------------------------------------------------------------------------------