diff --git a/.ci/bootstrap b/.ci/bootstrap deleted file mode 100755 index 7076e7e..0000000 --- a/.ci/bootstrap +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -GIT_ROOT=$(git rev-parse --show-toplevel) - -if [ "$GIT_ROOT" == "" ]; then - echo "Git root cannot be empty" - exit 1 -fi - -rm -f $GIT_ROOT/.git/hooks/pre-commit &> /dev/null -ln -s $GIT_ROOT/.ci/pre-commit-hook $GIT_ROOT/.git/hooks/pre-commit diff --git a/.ci/create-static-binary.sh b/.ci/create-static-binary.sh deleted file mode 100755 index a33dad5..0000000 --- a/.ci/create-static-binary.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -echo "Building binary in docker" - -docker build . -t schlez/fnm-static-binary - -echo "Copying to ./fnm" - -docker run --rm -v $(pwd):$(pwd) --workdir $(pwd) schlez/fnm-static-binary cp /app/_esy/default/build/default/executable/FnmApp.exe ./fnm -strip ./fnm diff --git a/.ci/esy-build-steps.yml b/.ci/esy-build-steps.yml deleted file mode 100644 index 2333e3f..0000000 --- a/.ci/esy-build-steps.yml +++ /dev/null @@ -1,26 +0,0 @@ -# Cross-platform set of build steps for building esy projects - -steps: - - task: NodeTool@0 - inputs: - versionSpec: '8.9' - - script: npm install -g esy@latest - displayName: 'npm install -g esy@latest' - - script: esy - displayName: 'esy install' - - script: esy verify-fnm-package - displayName: 'Verify Fnm__Package.re file' - - script: esy pesy - displayName: 'esy pesy' - - script: esy build - displayName: 'esy build' - - script: esy test - displayName: 'esy test' - - script: esy x fnm.exe - displayName: 'Run the main binary' - - script: esy ls-libs - continueOnError: true - displayName: 'Show all libraries including this package lib' - - script: esy release - displayName: 'Test Creation of Prebuilt Binary Releases' - continueOnError: true diff --git a/.ci/install.sh b/.ci/install.sh index 740af80..26b9c69 100755 --- a/.ci/install.sh +++ b/.ci/install.sh @@ -76,15 +76,20 @@ download_fnm() { echo "Downloading $URL..." mkdir -p "$INSTALL_DIR" &>/dev/null - curl --progress-bar -L "$URL" -o "$DOWNLOAD_DIR/$FILENAME.zip" - if [ 0 -ne $? ]; then + if ! curl --progress-bar -L "$URL" -o "$DOWNLOAD_DIR/$FILENAME.zip"; then echo "Download failed. Check that the release/filename are correct." exit 1 fi unzip -q "$DOWNLOAD_DIR/$FILENAME.zip" -d "$DOWNLOAD_DIR" - mv "$DOWNLOAD_DIR/$FILENAME/fnm" "$INSTALL_DIR/fnm" + + if [ -f "$DOWNLOAD_DIR/fnm" ]; then + mv "$DOWNLOAD_DIR/fnm" "$INSTALL_DIR/fnm" + else + mv "$DOWNLOAD_DIR/$FILENAME/fnm" "$INSTALL_DIR/fnm" + fi + chmod u+x "$INSTALL_DIR/fnm" fi } @@ -133,7 +138,7 @@ ensure_containing_dir_exists() { } setup_shell() { - CURRENT_SHELL=$(basename $SHELL) + CURRENT_SHELL="$(basename "$SHELL")" if [ "$CURRENT_SHELL" == "zsh" ]; then CONF_FILE=$HOME/.zshrc diff --git a/.ci/pre-commit-hook b/.ci/pre-commit-hook deleted file mode 100755 index aa7e446..0000000 --- a/.ci/pre-commit-hook +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -set -e - -npx lint-staged diff --git a/.ci/prepare-fnm-package.js b/.ci/prepare-fnm-package.js deleted file mode 100755 index c056ffd..0000000 --- a/.ci/prepare-fnm-package.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - -const fs = require("fs"); -const path = require("path"); -const cp = require("child_process"); -const jestDiff = require("jest-diff"); - -const version = require("../package.json").version; -const filepath = path.resolve(__dirname, "..", "library", "Fnm__Package.re"); - -main({ failOnDifference: process.argv[2] === "--fail-on-difference" }); - -function generateModule() { - const moduleText = ` - let version = "${version}"; - `; - return cp.execSync(`esy refmt`, { input: moduleText }).toString(); -} - -function readFile() { - try { - return fs.readFileSync(filepath, "utf8"); - } catch (e) { - return ""; - } -} - -function main({ failOnDifference }) { - const result = generateModule(); - - if (failOnDifference) { - const currentContents = readFile(); - if (currentContents !== result) { - console.log(jestDiff(result, currentContents)); - console.log( - "Fnm__Package.re is outdated! Please update it with `esy update-fnm-package`." - ); - process.exit(1); - } - } - - fs.writeFileSync(filepath, result); -} diff --git a/.ci/prepare-version.js b/.ci/prepare-version.js deleted file mode 100755 index b11c6b9..0000000 --- a/.ci/prepare-version.js +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env node - -const fs = require("fs"); -const cp = require("child_process"); -const ARGUMENTS = process.argv.slice(2); - -const versions = { - patch: "patch", - minor: "minor", - major: "major" -}; - -if (!ARGUMENTS[0]) { - console.log( - [ - "esy version:prepare, prepare a new fnm version", - "", - "Usage:", - "------", - "", - " esy version:prepare patch - to prepare a patch version (X.X.X+1)", - " esy version:prepare minor - to prepare a minor version (X.X+1.0)", - " esy version:prepare major - to prepare a major version (X+1.0.0)" - ].join("\n") - ); - process.exit(1); -} -const versionType = versions[ARGUMENTS[0].toLowerCase()]; -if (!versionType) { - throw new Error("Version (argument 0) must be one of major/minor/patch."); -} - -const pkgJson = JSON.parse(fs.readFileSync("./package.json", "utf8")); -pkgJson.version = changeVersion(versionType, pkgJson.version); -fs.writeFileSync("./package.json", JSON.stringify(pkgJson, null, 2)); - -exec("git fetch origin"); -exec("esy update-fnm-package"); -exec("esy verify-fnm-package"); -exec("esy build"); -exec("./docs/record_screen.sh"); -exec(`esy changelog`, { NEXT_VERSION: `v${pkgJson.version}` }); - -function exec(command, env) { - console.log(`$ ${command}`); - return cp.execSync(command, { - stdio: "inherit", - env: { ...process.env, ...env } - }); -} - -function changeVersion(type, version) { - const [major, minor, patch] = version.split(".").map(x => parseFloat(x, 10)); - switch (type) { - case "patch": - return [major, minor, patch + 1].join("."); - case "minor": - return [major, minor + 1, 0].join("."); - case "major": - return [major + 1, 0, 0].join("."); - } -} diff --git a/.ci/print-licenses.js b/.ci/print-licenses.js deleted file mode 100755 index 775d39c..0000000 --- a/.ci/print-licenses.js +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env node - -const { execSync } = require("child_process"); - -const groupByMap = (xs, fn, mapFn) => { - const grouped = {}; - - for (const x of xs) { - const key = fn(x); - grouped[key] = grouped[key] || []; - grouped[key].push(mapFn(x)); - } - - return grouped; -}; - -const licenses = execSync('grep -r "license:" esy.lock') - .toString() - .split("\n") - .map(x => x.trim()) - .filter(Boolean) - .map(line => { - const [path, , license] = line.split(":"); - const dependency = path - .split("/") - .slice(1) - .join("/") - .match(/^(.+)\/[^/]+$/)[1]; - return { dependency, license: JSON.parse(license.trim()) }; - }); - -const byLicense = groupByMap( - licenses, - ({ license }) => license, - ({ dependency }) => dependency -); - -for (const [license, packages] of Object.entries(byLicense)) { - console.log(`${license}:`); - for (const package of packages) { - console.log(` - ${package}`); - } -} diff --git a/.ci/publish-build-cache.yml b/.ci/publish-build-cache.yml deleted file mode 100644 index faeb3f8..0000000 --- a/.ci/publish-build-cache.yml +++ /dev/null @@ -1,11 +0,0 @@ -# Steps for publishing project cache - -steps: - - task: PublishBuildArtifacts@1 - displayName: 'Cache: Upload install folder' - condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/master')) - inputs: - pathToPublish: '$(ESY__CACHE_INSTALL_PATH)' - artifactName: 'cache-$(Agent.OS)-install' - parallel: true - parallelCount: 8 diff --git a/.ci/restore-build-cache.yml b/.ci/restore-build-cache.yml deleted file mode 100644 index 41bd5c8..0000000 --- a/.ci/restore-build-cache.yml +++ /dev/null @@ -1,23 +0,0 @@ -# Steps for restoring project cache - -steps: - - task: DownloadBuildArtifacts@0 - condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/master')) - displayName: 'Cache: Restore install' - inputs: - buildType: 'specific' - project: '$(System.TeamProject)' - pipeline: '$(Build.DefinitionName)' - branchName: 'refs/heads/master' - buildVersionToDownload: 'latestFromBranch' - downloadType: 'single' - artifactName: 'cache-$(Agent.OS)-install' - downloadPath: '$(System.ArtifactsDirectory)' - continueOnError: true - - - task: CopyFiles@2 - condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/master')) - inputs: - sourceFolder: '$(System.ArtifactsDirectory)\cache-$(Agent.OS)-install' - targetFolder: '$(ESY__CACHE_INSTALL_PATH)' - continueOnError: true diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 7ac74dd..0000000 --- a/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -_build -_esy -node_modules -Dockerfile diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c63537e --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +*__Fish.snap linguist-language=fish +*__Zsh.snap linguist-language=Shell +*__Bash.snap linguist-language=Shell +*__PowerShell.snap linguist-language=PowerShell +*__WinCmd.snap linguist-language=Batchfile diff --git a/.github/workflows/refmt.yml b/.github/workflows/refmt.yml deleted file mode 100644 index 76cb551..0000000 --- a/.github/workflows/refmt.yml +++ /dev/null @@ -1,67 +0,0 @@ -name: Check formatting -on: - pull_request: - push: - branches: - - master - -# consider using docker: ocaml/opam2:4.06 -# - sudo apt-get update && apt-get install -y m4 -# - opam update && opam install reason -# - refmt # is new - -jobs: - # build: - # name: build project - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@master - # with: - # fetch-depth: 1 - # - uses: actions/setup-node@v1 - # with: - # node-version: '10.x' - # - run: npm install -g esy@latest - # - run: esy i - # - run: esy b - # - run: esy export-dependencies - # - run: tar -czf build.tar.gz _export - # - uses: actions/upload-artifact@master - # with: - # name: cache-linux-build-dependencies - # path: build.tar.gz - - test_refmt: - name: run refmt - runs-on: ubuntu-latest - # needs: [build] - steps: - - uses: actions/checkout@master - with: - fetch-depth: 1 - - uses: actions/setup-node@v1 - with: - node-version: '10.x' - # - run: npm install -g esy@latest - # - uses: actions/download-artifact@master - # with: - # name: cache-linux-build-dependencies - # - run: tar -xzf cache-linux-build-dependencies/build.tar.gz - # - run: esy import-build _export/* - # - run: esy i - # - run: esy fmt - - run: npm i -g esy@latest - - run: esy @fmt i - - run: esy @fmt refmt --in-place */*.re - # - run: ./scripts/fmt_all.sh - # name: refmt all the files - - run: | - if [ -n "$(git status --porcelain)" ]; then - echo "There are differences:" - git status --porcelain - echo "----" - echo "" - echo 'Please run `esy fmt` locally to fix the issues.' - exit 1 - fi - name: "Throw if something changed" diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..a84107b --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,175 @@ +name: Rust + +on: [push] + +jobs: + fmt: + runs-on: ubuntu-latest + steps: + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: stable + - uses: actions/checkout@v1 + - name: cargo fmt + run: cargo fmt -- --check + + unit_tests: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macOS-latest, windows-latest] + steps: + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: stable + - uses: actions/checkout@v1 + - name: Run tests + run: cargo test -- --skip=feature_tests + + e2e_tests: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macOS-latest, windows-latest] + steps: + - name: Install Fish and Zsh using brew + if: "startsWith(matrix.os, 'macOS')" + run: brew install fish zsh + - name: Install Fish and Zsh using apt + if: "startsWith(matrix.os, 'ubuntu')" + run: sudo apt-get install -y fish zsh + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: stable + - uses: actions/checkout@v1 + - name: Run tests + run: cargo test -- feature_tests + + build_release: + runs-on: windows-latest + name: "Release build for Windows" + steps: + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: stable + - uses: actions/checkout@v1 + - name: Build release binary + run: cargo build --release + env: + RUSTFLAGS: "-C target-feature=+crt-static" + - name: Compress binary using UPX + run: | + choco install upx + upx target/release/fnm.exe + - uses: actions/upload-artifact@v2 + with: + name: fnm-windows + path: target/release/fnm.exe + + build_macos_release: + runs-on: macOS-latest + name: "Release build for MacOS" + steps: + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: stable + - uses: actions/checkout@v1 + - name: Build release binary + run: cargo build --release + env: + LZMA_API_STATIC: "true" + - name: Strip binary from debug symbols + run: strip target/release/fnm + - name: List dynamically linked libraries + run: otool -L target/release/fnm + - name: Compress binary using UPX + run: | + brew install upx + upx target/release/fnm + - uses: actions/upload-artifact@v2 + with: + name: fnm-macos + path: target/release/fnm + + build_static_linux_binary: + name: "Build static Linux binary" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Build static binary + run: | + sudo chown -R 1000:1000 . + docker run --rm -v "$(pwd)":/home/rust/src ekidd/rust-musl-builder:stable \ + cargo build --release + sudo chown -R $(whoami):$(whoami) . + - name: Compress binary using UPX + run: | + sudo apt-get install -y upx + upx target/x86_64-unknown-linux-musl/release/fnm + - uses: actions/upload-artifact@v2 + with: + name: fnm-linux + path: target/x86_64-unknown-linux-musl/release/fnm + + # benchmark_on_linux: + # name: Performance Benchmarks (Linux) + # needs: [build_static_linux_binary] + # runs-on: ubuntu-latest + # steps: + # - uses: octokit/request-action@v2.x + # id: get_master_workflows + # with: + # route: GET /repos/:repository/actions/runs + # repository: ${{ github.repository }} + # branch: master + # status: completed + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # - uses: octokit/request-action@v2.x + # id: get_latest_artifacts + # with: + # route: GET /repos/:repository/actions/runs/:workflow_id/artifacts + # repository: ${{ github.repository }} + # workflow_id: ${{ fromJson(steps.get_master_workflows.outputs.data).workflow_runs[0].id }} + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # - name: "Take the output" + # run: | + # URL=$(echo '${{ steps.get_latest_artifacts.outputs.data }}' | jq -r '.artifacts | map(select(.name == "fnm-linux")) | .[0].archive_download_url') + # curl -L $URL -H 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' > /tmp/fnm-latest.zip + # mkdir ~/.fnm-latest + # unzip -d ~/.fnm-latest /tmp/fnm-latest.zip + # ls -lah ~/.fnm-latest + # - uses: actions/checkout@v2 + # - name: Install Hyperfine + # run: | + # wget https://github.com/sharkdp/hyperfine/releases/download/v1.10.0/hyperfine_1.10.0_amd64.deb + # sudo dpkg -i hyperfine_1.10.0_amd64.deb + # - name: Install fnm-reason for Linux + # run: curl -fsSL https://github.com/Schniz/fnm/raw/master/.ci/install.sh | bash -s -- --skip-shell + # - name: Install nvm + # run: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash + # - uses: actions/download-artifact@v2 + # with: + # name: fnm-linux + # path: target/release/ + # - name: "Run benchmarks" + # run: bash benchmarks/run + + # - name: Read basic.md for the generated report + # id: basic_result + # uses: juliangruber/read-file-action@v1 + # with: + # path: benchmarks/results/basic.md + + # - uses: octokit/request-action@v2.x + # id: get_latest_release + # with: + # route: POST /repos/:repository/commits/:commit_sha/comments + # repository: ${{ github.repository }} + # commit_sha: ${{ github.sha }} + # body: | + # | + # ${{ steps.basic_result.outputs.content }} + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 6fef430..6a7a043 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,6 @@ -npm-debug.log -.merlin -yarn-error.log -node_modules -node_modules/ -_build -_release -_esy/ -fnm.install -.DS_Store -*.install -.tmp docs/screen_recording -.idea -.fnmTmp \ No newline at end of file +/benchmarks/results +/target +**/*.rs.bk +feature_tests/.tmp +*.log diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..49dca54 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2048 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "addr2line" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" + +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + +[[package]] +name = "aho-corasick" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86" +dependencies = [ + "memchr", +] + +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "arrayref" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" + +[[package]] +name = "arrayvec" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "backtrace" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1931848a574faa8f7c71a12ea00453ff5effbb5f51afe7f77d7a48cace6ac1" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide 0.4.2", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "bitflags" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" + +[[package]] +name = "blake2b_simd" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "bstr" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" +dependencies = [ + "lazy_static", + "memchr", + "regex-automata", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "bytes" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" + +[[package]] +name = "bzip2" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42b7c3cbf0fa9c1b82308d57191728ca0256cb821220f4e2fd410a72ade26e3b" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.9+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad3b39a260062fca31f7b0b12f207e8f2590a67d32ec7d59c20484b07ea7285e" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "cc" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef611cc68ff783f18535d77ddd080185275713d852c4f5cbb6122c462a7a825c" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "serde", + "time", + "winapi 0.3.9", +] + +[[package]] +name = "clap" +version = "2.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" +dependencies = [ + "ansi_term", + "atty", + "bitflags", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags", +] + +[[package]] +name = "colored" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +dependencies = [ + "atty", + "lazy_static", + "winapi 0.3.9", +] + +[[package]] +name = "console" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c0994e656bba7b922d8dd1245db90672ffb701e684e45be58f20719d69abc5a" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "terminal_size", + "termios", + "winapi 0.3.9", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "core-foundation" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" + +[[package]] +name = "crc32fast" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg", + "cfg-if", + "lazy_static", +] + +[[package]] +name = "csv" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" +dependencies = [ + "bstr", + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctor" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbaabec2c953050352311293be5c6aba8e141ba19d6811862b232d6fd020484" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "difference" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" + +[[package]] +name = "dirs" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142995ed02755914747cc6ca76fc7e4583cd18578746716d0508ea6ed558b9ff" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", +] + +[[package]] +name = "doc-comment" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" + +[[package]] +name = "dtoa" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "134951f4028bdadb9b84baf4232681efbf277da25144b9b0ad65df75946c422b" + +[[package]] +name = "duct" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90a9c3a25aafbd538c7d40a53f83c4487ee8216c12d1c8ef2c01eb2f6ea1553" +dependencies = [ + "libc", + "once_cell", + "os_pipe", + "shared_child", +] + +[[package]] +name = "embed-resource" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f6b0b4403da80c2fd32333937dd468292c001d778c587ae759b75432772715d" +dependencies = [ + "vswhom", + "winreg 0.6.2", +] + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "encoding_rs" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a51b8cf747471cb9499b6d59e59b0444f4c90eba8968c4e44874e92b5b64ace2" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "encoding_rs_io" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cc3c5651fb62ab8aa3103998dade57efdd028544bd300516baa31840c252a83" +dependencies = [ + "encoding_rs", +] + +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "filetime" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed85775dcc68644b5c950ac06a2b23768d3bc9390464151aaf27136998dcf9e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "winapi 0.3.9", +] + +[[package]] +name = "flate2" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" +dependencies = [ + "cfg-if", + "crc32fast", + "libc", + "miniz_oxide 0.3.7", +] + +[[package]] +name = "fnm" +version = "0.1.0" +dependencies = [ + "atty", + "chrono", + "clap", + "colored", + "csv", + "dirs", + "duct", + "embed-resource", + "encoding_rs_io", + "env_logger", + "indoc", + "insta", + "log", + "pretty_assertions", + "reqwest", + "semver", + "serde", + "serde_json", + "serial_test", + "shell-escape", + "snafu", + "structopt", + "tar", + "tempfile", + "test-env-log", + "xz2", + "zip", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + +[[package]] +name = "futures-channel" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f366ad74c28cca6ba456d95e6422883cfb4b252a83bed929c83abfdbbf2967d5" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59f5fff90fd5d971f936ad674802482ba441b6f09ba5e15fd8b39145582ca399" + +[[package]] +name = "futures-io" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de27142b013a8e869c14957e6d2edeef89e97c289e69d042ee3a49acd8b51789" + +[[package]] +name = "futures-sink" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2032893cb734c7a05d85ce0cc8b8c4075278e93b24b66f9de99d6eb0fa8acc" + +[[package]] +name = "futures-task" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb66b5f09e22019b1ab0830f7785bcea8e7a42148683f99214f73f8ec21a626" +dependencies = [ + "once_cell", +] + +[[package]] +name = "futures-util" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8764574ff08b701a084482c3c7031349104b07ac897393010494beaa18ce32c6" +dependencies = [ + "futures-core", + "futures-io", + "futures-task", + "memchr", + "pin-project", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" + +[[package]] +name = "h2" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993f9e0baeed60001cf565546b0d3dbe6a6ad23f2bd31644a133c641eccf6d53" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" + +[[package]] +name = "heck" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c30f6d0bc6b00693347368a67d41b58f2fb851215ff1da49e90fe2c5c667151" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "httparse" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" + +[[package]] +name = "httpdate" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "hyper" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3afcfae8af5ad0576a31e768415edb627824129e8e5a29b8bfccb2f234e835" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-tls", +] + +[[package]] +name = "idna" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "indoc" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644defcefee68d7805653a682e99a2e2a5014a1fc3cc9be7059a215844eeea6f" +dependencies = [ + "unindent", +] + +[[package]] +name = "insta" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617e921abc813f96a3b00958c079e7bf1e2db998f8a04f1546dd967373a418ee" +dependencies = [ + "backtrace", + "console", + "difference", + "lazy_static", + "serde", + "serde_json", + "serde_yaml", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + +[[package]] +name = "ipnet" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" + +[[package]] +name = "itoa" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" + +[[package]] +name = "js-sys" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca059e81d9486668f12d455a4ea6daa600bd408134cd17e3d3fb5a32d1f016f8" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa7087f49d294270db4e1928fc110c976cd4b9e5a16348e0a1df09afa99e6c98" + +[[package]] +name = "linked-hash-map" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" + +[[package]] +name = "lock_api" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "lzma-sys" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f24f76ec44a8ac23a31915d6e326bca17ce88da03096f1ff194925dc714dac99" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" + +[[package]] +name = "memchr" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mime_guess" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +dependencies = [ + "adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c60c0dfe32c10b43a144bad8fc83538c52f58302c92300ea7ec7bf7b38d5a7b9" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.6.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fce347092656428bc8eaf6201042cb551b8d67855af7374542a92a0fbfcac430" +dependencies = [ + "cfg-if", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow", + "net2", + "slab", + "winapi 0.2.8", +] + +[[package]] +name = "miow" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + +[[package]] +name = "native-tls" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b0d88c06fe90d5ee94048ba40409ef1d9315d86f6f38c2efdaad4fb50c58b2d" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "net2" +version = "0.2.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ebc3ec692ed7c9a255596c67808dee269f64655d8baf7b4f0638e51ba1d6853" +dependencies = [ + "cfg-if", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "num-integer" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab52be62400ca80aa00285d25253d7f7c437b7375c4de678f5405d3afe82ca5" + +[[package]] +name = "once_cell" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad" + +[[package]] +name = "openssl" +version = "0.10.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d575eff3665419f9b83678ff2815858ad9d11567e082f5ac1814baba4e2bcb4" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "lazy_static", + "libc", + "openssl-sys", +] + +[[package]] +name = "openssl-probe" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" + +[[package]] +name = "openssl-sys" +version = "0.9.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a842db4709b604f0fe5d1170ae3565899be2ad3d9cbc72dedc789ac0511f78de" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "os_pipe" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb233f06c2307e1f5ce2ecad9f8121cffbbee2c95428f44ea85222e460d0d213" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "output_vt100" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "parking_lot" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" +dependencies = [ + "cfg-if", + "cloudabi", + "libc", + "redox_syscall", + "smallvec", + "winapi 0.3.9", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b9e280448854bd91559252582173b3bd1f8e094a0e644791c0628ca9b1f144f" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "0.4.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8c8b352676bc6a4c3d71970560b913cea444a7a921cc2e2d920225e4b91edaa" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e555d9e657502182ac97b539fb3dae8b79cda19e3e4f8ffb5e8de4f18df93c95" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33" + +[[package]] +name = "ppv-lite86" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c36fa947111f5c62a733b652544dd0016a43ce89619538a8ef92724a6f501a20" + +[[package]] +name = "pretty_assertions" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427" +dependencies = [ + "ansi_term", + "ctor", + "difference", + "output_vt100", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "redox_users" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +dependencies = [ + "getrandom", + "redox_syscall", + "rust-argon2", +] + +[[package]] +name = "regex" +version = "1.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-automata" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" +dependencies = [ + "byteorder", +] + +[[package]] +name = "regex-syntax" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "reqwest" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9eaa17ac5d7b838b7503d118fa16ad88f440498bf9ffe5424e621f93190d61e" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "mime_guess", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg 0.7.0", +] + +[[package]] +name = "rust-argon2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dab61250775933275e84053ac235621dfb739556d5c54a2f2e9313b7cf43a19" +dependencies = [ + "base64", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "schannel" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +dependencies = [ + "lazy_static", + "winapi 0.3.9", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "security-framework" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64808902d7d99f78eaddd2b4e2509713babc3dc3c85ad6f4c447680f3c01e535" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17bf11d99252f512695eb468de5516e5cf75455521e69dfe343f3b74e4748405" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "394cec28fa623e00903caf7ba4fa6fb9a0e260280bb8cdbbba029611108a0190" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96fe57af81d28386a513cbc6858332abc6117cfdb5999647c6444b8f43a370a5" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f630a6370fd8e457873b4bd2ffdae75408bc291ba72be773772a4c2a065d9ae8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a230ea9107ca2220eea9d46de97eddcb04cd00e92d13dda78e478dd33fa82bd4" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" +dependencies = [ + "dtoa", + "itoa", + "serde", + "url", +] + +[[package]] +name = "serde_yaml" +version = "0.8.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3e2dd40a7cdc18ca80db804b7f461a39bb721160a85c9a1fa30134bf3c02a5" +dependencies = [ + "dtoa", + "linked-hash-map", + "serde", + "yaml-rust", +] + +[[package]] +name = "serial_test" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fef5f7c7434b2f2c598adc6f9494648a1e41274a75c0ba4056f680ae0c117fd6" +dependencies = [ + "lazy_static", + "parking_lot", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d08338d8024b227c62bd68a12c7c9883f5c66780abaef15c550dc56f46ee6515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "shared_child" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cebcf3a403e4deafaf34dc882c4a1b6a648b43e5670aa2e4bb985914eaeb2d2" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "shell-escape" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" + +[[package]] +name = "slab" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" + +[[package]] +name = "smallvec" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" + +[[package]] +name = "snafu" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c4e6046e4691afe918fd1b603fd6e515bcda5388a1092a9edbada307d159f09" +dependencies = [ + "backtrace", + "doc-comment", + "snafu-derive", +] + +[[package]] +name = "snafu-derive" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7073448732a89f2f3e6581989106067f403d378faeafb4a50812eb814170d3e5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "socket2" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1fa70dc5c8104ec096f4fe7ede7a221d35ae13dcd19ba1ad9a81d2cab9a1c44" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "winapi 0.3.9", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "structopt" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33f6461027d7f08a13715659b2948e1602c31a3756aeae9378bfe7518c72e82" +dependencies = [ + "clap", + "lazy_static", + "structopt-derive", +] + +[[package]] +name = "structopt-derive" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92e775028122a4b3dd55d58f14fc5120289c69bee99df1d117ae30f84b225c9" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c51d92969d209b54a98397e1b91c8ae82d8c87a7bb87df0b29aa2ad81454228" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tar" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "489997b7557e9a43e192c527face4feacc78bfbe6eed67fd55c4c9e381cba290" +dependencies = [ + "filetime", + "libc", + "redox_syscall", + "xattr", +] + +[[package]] +name = "tempfile" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" +dependencies = [ + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi 0.3.9", +] + +[[package]] +name = "termcolor" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "terminal_size" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a14cd9f8c72704232f0bfc8455c0e861f0ad4eb60cc9ec8a170e231414c1e13" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "termios" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2" +dependencies = [ + "libc", +] + +[[package]] +name = "test-env-log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f984204ada5004c4e43a414b4145b81ae84a7445ba42fe54de4fc1a9e8f887bf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi 0.3.9", +] + +[[package]] +name = "tinyvec" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238ce071d267c5710f9d31451efec16c5ee22de34df17cc05e56cbc92e967117" + +[[package]] +name = "tokio" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d34ca54d84bf2b5b4d7d31e901a8464f7b60ac145a284fba25ceb801f2ddccd" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "iovec", + "lazy_static", + "memchr", + "mio", + "num_cpus", + "pin-project-lite", + "slab", +] + +[[package]] +name = "tokio-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower-service" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" + +[[package]] +name = "tracing" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0987850db3733619253fe60e17cb59b82d37c7e6c0236bb81e4d6b87c879f27" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +dependencies = [ + "matches", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb19cf769fa8c6a80a162df694621ebeb4dafb606470b2b2fce0be40a98a977" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" + +[[package]] +name = "unicode-width" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" + +[[package]] +name = "unicode-xid" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" + +[[package]] +name = "unindent" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af41d708427f8fd0e915dcebb2cae0f0e6acb2a939b2d399c265c39a38a18942" + +[[package]] +name = "url" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" +dependencies = [ + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "vcpkg" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f5402d3d0e79a069714f7b48e3ecc60be7775a2c049cb839457457a239532" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasm-bindgen" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ac64ead5ea5f05873d7c12b545865ca2b8d28adfc50a49b84770a3a97265d42" +dependencies = [ + "cfg-if", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f22b422e2a757c35a73774860af8e112bff612ce6cb604224e8e47641a9e4f68" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7866cab0aa01de1edf8b5d7936938a7e397ee50ce24119aef3e1eaa3b6171da" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b13312a745c08c469f0b292dd2fcd6411dba5f7160f593da6ef69b64e407038" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f249f06ef7ee334cc3b8ff031bfc11ec99d00f34d86da7498396dc1e3b1498fe" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307" + +[[package]] +name = "web-sys" +version = "0.3.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bf6ef87ad7ae8008e15a355ce696bed26012b7caa21605188cfd8214ab51e2d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winreg" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "xattr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +dependencies = [ + "libc", +] + +[[package]] +name = "xz2" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c179869f34fc7c01830d3ce7ea2086bc3a07e0d35289b667d0a8bf910258926c" +dependencies = [ + "lzma-sys", +] + +[[package]] +name = "yaml-rust" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39f0c922f1a334134dc2f7a8b67dc5d25f0735263feec974345ff706bcf20b0d" +dependencies = [ + "linked-hash-map", +] + +[[package]] +name = "zip" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "543adf038106b64cfca4711c82c917d785e3540e04f7996554488f988ec43124" +dependencies = [ + "byteorder", + "bzip2", + "crc32fast", + "flate2", + "thiserror", + "time", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..36a5f79 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "fnm" +version = "0.1.0" +authors = ["Gal Schlezinger "] +edition = "2018" +build = "build.rs" + +[dependencies] +serde = { version = "1.0.115", features = ["derive"] } +clap = "2.33.3" +structopt = "0.3.16" +reqwest = { version = "0.10.7", features = ["blocking", "json"] } +serde_json = "1.0.57" +chrono = { version = "0.4.15", features = ["serde"] } +tar = "0.4.29" +xz2 = "0.1.6" +semver = "0.10.0" +dirs = "3.0.1" +colored = "2.0.0" +zip = "0.5.6" +tempfile = "3.1.0" +indoc = "1.0.2" +snafu = { version = "0.6.8", features = ["backtrace"] } +log = "0.4.11" +env_logger = "0.7.1" +atty = "0.2.14" +encoding_rs_io = "0.1.7" + +[dev-dependencies] +pretty_assertions = "0.6.1" +duct = "0.13.4" +test-env-log = "0.2.2" +shell-escape = "0.1.5" +insta = { version = "0.16.1", features = ["backtrace"] } +serial_test = "0.4.0" + +[build-dependencies] +embed-resource = "1.3.3" + +[target.'cfg(windows)'.dependencies] +csv = "1.1.3" diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 4cb2aed..0000000 --- a/Dockerfile +++ /dev/null @@ -1,18 +0,0 @@ -FROM frolvlad/alpine-glibc - -RUN apk add --no-cache nodejs bash npm curl g++ make m4 patch gmp-dev perl git jq perl-utils libressl-dev coreutils - -USER root - -RUN npm -g config set user root -RUN npm i -g esy@latest - -WORKDIR /app -ADD . /app - -RUN jq '. | .buildDirs.executable.flags |= . + ["-ccopt", "-static"]' package.json > package.json.new && mv package.json.new package.json -RUN npx esy i -RUN npx esy verify-fnm-package -RUN npx esy pesy -RUN npx esy b -RUN npx esy test diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 004c727..0000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,74 +0,0 @@ -# Starter pipeline -# Start with a minimal pipeline that you can customize to build and deploy your code. -# Add steps that build, run tests, deploy, and more: -# https://aka.ms/yaml - -name: $(Build.SourceVersion) -jobs: -- job: Linux - timeoutInMinutes: 0 - pool: - vmImage: 'Ubuntu 16.04' - - variables: - ESY__CACHE_INSTALL_PATH: /home/vsts/.esy/3_____________________________________________________________________/i/ - ESY__CACHE_SOURCE_TARBALL_PATH: /home/vsts/.esy/source/i - - steps: - # TODO: Uncomment both this and 'publish-build-cache' below to enable build caching for Linux. - # - template: .ci/restore-build-cache.yml - - script: sudo apt-get install -y fish - - script: .ci/create-static-binary.sh - - script: ./feature_tests/run.sh $(pwd)/fnm - # - script: bash .ci/prepare-static-build.sh - # - template: .ci/esy-build-steps.yml - # - template: .ci/publish-build-cache.yml - - task: PublishBuildArtifacts@1 - displayName: 'Save artifact' - inputs: - PathtoPublish: fnm - ArtifactName: fnm-linux - -- job: MacOS - timeoutInMinutes: 0 - pool: - vmImage: 'macOS 10.14' - - variables: - ESY__CACHE_INSTALL_PATH: /Users/vsts/.esy/3____________________________________________________________________/i/ - ESY__CACHE_SOURCE_TARBALL_PATH: /Users/vsts/.esy/source/i - - steps: - # TODO: Uncomment both this and 'publish-build-cache' below to enable build caching for Mac. - # - template: .ci/restore-build-cache.yml - - script: brew install fish gmp - - script: sudo rm $(brew --prefix gmp)/lib/*.dylib - # remove /usr/local/lib/libgmp.dylib - - template: .ci/esy-build-steps.yml - - script: cp _esy/default/build/default/executable/FnmApp.exe _esy/default/build/fnm - - script: otool -L _esy/default/build/fnm - displayName: 'list dynamic libraries' - - script: strip _esy/default/build/fnm - - script: ./feature_tests/run.sh $(pwd)/_esy/default/build/fnm - # - template: .ci/publish-build-cache.yml - - task: PublishBuildArtifacts@1 - displayName: 'Save artifact' - inputs: - PathtoPublish: '_esy/default/build/fnm' - ArtifactName: fnm-macos - -- job: Release - timeoutInMinutes: 0 - displayName: Release - dependsOn: - - Linux - - MacOS - condition: succeeded() - pool: - vmImage: ubuntu-16.04 - steps: - - task: PublishBuildArtifacts@1 - displayName: 'Release Package' - inputs: - PathtoPublish: '.' - ArtifactName: npm-package diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..44aaf26 --- /dev/null +++ b/build.rs @@ -0,0 +1,3 @@ +fn main() { + embed_resource::compile("fnm-manifest.rc"); +} diff --git a/dune b/dune deleted file mode 100644 index c8e261a..0000000 --- a/dune +++ /dev/null @@ -1 +0,0 @@ -(dirs (:standard \ node_modules \ _esy)) \ No newline at end of file diff --git a/dune-project b/dune-project deleted file mode 100644 index 28bf472..0000000 --- a/dune-project +++ /dev/null @@ -1,2 +0,0 @@ -(lang dune 1.6) - (name fnm) diff --git a/esy.lock/.gitattributes b/esy.lock/.gitattributes deleted file mode 100644 index e0b4e26..0000000 --- a/esy.lock/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ - -# Set eol to LF so files aren't converted to CRLF-eol on Windows. -* text eol=lf linguist-generated diff --git a/esy.lock/.gitignore b/esy.lock/.gitignore deleted file mode 100644 index a221be2..0000000 --- a/esy.lock/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ - -# Reset any possible .gitignore, we want all esy.lock to be un-ignored. -!* diff --git a/esy.lock/index.json b/esy.lock/index.json deleted file mode 100644 index bae1965..0000000 --- a/esy.lock/index.json +++ /dev/null @@ -1,7055 +0,0 @@ -{ - "checksum": "da1004cd5badeed69934bbd318192f88", - "root": "fnm@link-dev:./package.json", - "node": { - "yargs-parser@16.1.0@d41d8cd9": { - "id": "yargs-parser@16.1.0@d41d8cd9", - "name": "yargs-parser", - "version": "16.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz#sha1:73747d53ae187e7b8dbe333f95714c76ea00ecf1" - ] - }, - "overrides": [], - "dependencies": ["decamelize@1.2.0@d41d8cd9", "camelcase@5.3.1@d41d8cd9"], - "devDependencies": [] - }, - "yargs-parser@13.1.1@d41d8cd9": { - "id": "yargs-parser@13.1.1@d41d8cd9", - "name": "yargs-parser", - "version": "13.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz#sha1:d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - ] - }, - "overrides": [], - "dependencies": ["decamelize@1.2.0@d41d8cd9", "camelcase@5.3.1@d41d8cd9"], - "devDependencies": [] - }, - "yargs@15.1.0@d41d8cd9": { - "id": "yargs@15.1.0@d41d8cd9", - "name": "yargs", - "version": "15.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz#sha1:e111381f5830e863a89550bd4b136bb6a5f37219" - ] - }, - "overrides": [], - "dependencies": [ - "yargs-parser@16.1.0@d41d8cd9", - "y18n@4.0.0@d41d8cd9", - "which-module@2.0.0@d41d8cd9", - "string-width@4.2.0@d41d8cd9", - "set-blocking@2.0.0@d41d8cd9", - "require-main-filename@2.0.0@d41d8cd9", - "require-directory@2.1.1@d41d8cd9", - "get-caller-file@2.0.5@d41d8cd9", - "find-up@4.1.0@d41d8cd9", - "decamelize@1.2.0@d41d8cd9", - "cliui@6.0.0@d41d8cd9" - ], - "devDependencies": [] - }, - "yargs@13.3.0@d41d8cd9": { - "id": "yargs@13.3.0@d41d8cd9", - "name": "yargs", - "version": "13.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz#sha1:4c657a55e07e5f2cf947f8a366567c04a0dedc83" - ] - }, - "overrides": [], - "dependencies": [ - "yargs-parser@13.1.1@d41d8cd9", - "y18n@4.0.0@d41d8cd9", - "which-module@2.0.0@d41d8cd9", - "string-width@3.1.0@d41d8cd9", - "set-blocking@2.0.0@d41d8cd9", - "require-main-filename@2.0.0@d41d8cd9", - "require-directory@2.1.1@d41d8cd9", - "get-caller-file@2.0.5@d41d8cd9", - "find-up@3.0.0@d41d8cd9", - "cliui@5.0.0@d41d8cd9" - ], - "devDependencies": [] - }, - "yaml@1.7.2@d41d8cd9": { - "id": "yaml@1.7.2@d41d8cd9", - "name": "yaml", - "version": "1.7.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz#sha1:f26aabf738590ab61efaca502358e48dc9f348b2" - ] - }, - "overrides": [], - "dependencies": ["@babel/runtime@7.8.4@d41d8cd9"], - "devDependencies": [] - }, - "yallist@4.0.0@d41d8cd9": { - "id": "yallist@4.0.0@d41d8cd9", - "name": "yallist", - "version": "4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#sha1:9bb92790d9c0effec63be73519e11a35019a3a72" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "yallist@3.1.1@d41d8cd9": { - "id": "yallist@3.1.1@d41d8cd9", - "name": "yallist", - "version": "3.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#sha1:dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "y18n@4.0.0@d41d8cd9": { - "id": "y18n@4.0.0@d41d8cd9", - "name": "y18n", - "version": "4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz#sha1:95ef94f85ecc81d007c264e190a120f0a3c8566b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "wrappy@1.0.2@d41d8cd9": { - "id": "wrappy@1.0.2@d41d8cd9", - "name": "wrappy", - "version": "1.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#sha1:b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "wrap-ansi@6.2.0@d41d8cd9": { - "id": "wrap-ansi@6.2.0@d41d8cd9", - "name": "wrap-ansi", - "version": "6.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz#sha1:e9393ba07102e6c91a3b221478f0257cd2856e53" - ] - }, - "overrides": [], - "dependencies": [ - "strip-ansi@6.0.0@d41d8cd9", - "string-width@4.2.0@d41d8cd9", - "ansi-styles@4.2.1@d41d8cd9" - ], - "devDependencies": [] - }, - "wrap-ansi@5.1.0@d41d8cd9": { - "id": "wrap-ansi@5.1.0@d41d8cd9", - "name": "wrap-ansi", - "version": "5.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz#sha1:1fd1f67235d5b6d0fee781056001bfb694c03b09" - ] - }, - "overrides": [], - "dependencies": [ - "strip-ansi@5.2.0@d41d8cd9", - "string-width@3.1.0@d41d8cd9", - "ansi-styles@3.2.1@d41d8cd9" - ], - "devDependencies": [] - }, - "wrap-ansi@3.0.1@d41d8cd9": { - "id": "wrap-ansi@3.0.1@d41d8cd9", - "name": "wrap-ansi", - "version": "3.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz#sha1:288a04d87eda5c286e060dfe8f135ce8d007f8ba" - ] - }, - "overrides": [], - "dependencies": [ - "strip-ansi@4.0.0@d41d8cd9", - "string-width@2.1.1@d41d8cd9" - ], - "devDependencies": [] - }, - "which-module@2.0.0@d41d8cd9": { - "id": "which-module@2.0.0@d41d8cd9", - "name": "which-module", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz#sha1:d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "which@2.0.2@d41d8cd9": { - "id": "which@2.0.2@d41d8cd9", - "name": "which", - "version": "2.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/which/-/which-2.0.2.tgz#sha1:7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - ] - }, - "overrides": [], - "dependencies": ["isexe@2.0.0@d41d8cd9"], - "devDependencies": [] - }, - "which@1.3.1@d41d8cd9": { - "id": "which@1.3.1@d41d8cd9", - "name": "which", - "version": "1.3.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/which/-/which-1.3.1.tgz#sha1:a45043d54f5805316da8d62f9f50918d3da70b0a" - ] - }, - "overrides": [], - "dependencies": ["isexe@2.0.0@d41d8cd9"], - "devDependencies": [] - }, - "util-deprecate@1.0.2@d41d8cd9": { - "id": "util-deprecate@1.0.2@d41d8cd9", - "name": "util-deprecate", - "version": "1.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#sha1:450d4dc9fa70de732762fbd2d4a28981419a0ccf" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "unique-slug@2.0.2@d41d8cd9": { - "id": "unique-slug@2.0.2@d41d8cd9", - "name": "unique-slug", - "version": "2.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz#sha1:baabce91083fc64e945b0f3ad613e264f7cd4e6c" - ] - }, - "overrides": [], - "dependencies": ["imurmurhash@0.1.4@d41d8cd9"], - "devDependencies": [] - }, - "unique-filename@1.1.1@d41d8cd9": { - "id": "unique-filename@1.1.1@d41d8cd9", - "name": "unique-filename", - "version": "1.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz#sha1:1d69769369ada0583103a1e6ae87681b56573230" - ] - }, - "overrides": [], - "dependencies": ["unique-slug@2.0.2@d41d8cd9"], - "devDependencies": [] - }, - "tslib@1.11.0@d41d8cd9": { - "id": "tslib@1.11.0@d41d8cd9", - "name": "tslib", - "version": "1.11.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/tslib/-/tslib-1.11.0.tgz#sha1:f1f3528301621a53220d58373ae510ff747a66bc" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "to-regex-range@5.0.1@d41d8cd9": { - "id": "to-regex-range@5.0.1@d41d8cd9", - "name": "to-regex-range", - "version": "5.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#sha1:1648c44aae7c8d988a326018ed72f5b4dd0392e4" - ] - }, - "overrides": [], - "dependencies": ["is-number@7.0.0@d41d8cd9"], - "devDependencies": [] - }, - "thenify-all@1.6.0@d41d8cd9": { - "id": "thenify-all@1.6.0@d41d8cd9", - "name": "thenify-all", - "version": "1.6.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz#sha1:1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - ] - }, - "overrides": [], - "dependencies": ["thenify@3.3.0@d41d8cd9"], - "devDependencies": [] - }, - "thenify@3.3.0@d41d8cd9": { - "id": "thenify@3.3.0@d41d8cd9", - "name": "thenify", - "version": "3.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz#sha1:e69e38a1babe969b0108207978b9f62b88604839" - ] - }, - "overrides": [], - "dependencies": ["any-promise@1.3.0@d41d8cd9"], - "devDependencies": [] - }, - "symbol-observable@1.2.0@d41d8cd9": { - "id": "symbol-observable@1.2.0@d41d8cd9", - "name": "symbol-observable", - "version": "1.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz#sha1:c22688aed4eab3cdc2dfeacbb561660560a00804" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "supports-color@7.1.0@d41d8cd9": { - "id": "supports-color@7.1.0@d41d8cd9", - "name": "supports-color", - "version": "7.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz#sha1:68e32591df73e25ad1c4b49108a2ec507962bfd1" - ] - }, - "overrides": [], - "dependencies": ["has-flag@4.0.0@d41d8cd9"], - "devDependencies": [] - }, - "supports-color@5.5.0@d41d8cd9": { - "id": "supports-color@5.5.0@d41d8cd9", - "name": "supports-color", - "version": "5.5.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#sha1:e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - ] - }, - "overrides": [], - "dependencies": ["has-flag@3.0.0@d41d8cd9"], - "devDependencies": [] - }, - "supports-color@2.0.0@d41d8cd9": { - "id": "supports-color@2.0.0@d41d8cd9", - "name": "supports-color", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz#sha1:535d045ce6b6363fa40117084629995e9df324c7" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "strip-final-newline@2.0.0@d41d8cd9": { - "id": "strip-final-newline@2.0.0@d41d8cd9", - "name": "strip-final-newline", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#sha1:89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "strip-eof@1.0.0@d41d8cd9": { - "id": "strip-eof@1.0.0@d41d8cd9", - "name": "strip-eof", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#sha1:bb43ff5598a6eb05d89b59fcd129c983313606bf" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "strip-ansi@6.0.0@d41d8cd9": { - "id": "strip-ansi@6.0.0@d41d8cd9", - "name": "strip-ansi", - "version": "6.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz#sha1:0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - ] - }, - "overrides": [], - "dependencies": ["ansi-regex@5.0.0@d41d8cd9"], - "devDependencies": [] - }, - "strip-ansi@5.2.0@d41d8cd9": { - "id": "strip-ansi@5.2.0@d41d8cd9", - "name": "strip-ansi", - "version": "5.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz#sha1:8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - ] - }, - "overrides": [], - "dependencies": ["ansi-regex@4.1.0@d41d8cd9"], - "devDependencies": [] - }, - "strip-ansi@4.0.0@d41d8cd9": { - "id": "strip-ansi@4.0.0@d41d8cd9", - "name": "strip-ansi", - "version": "4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz#sha1:a8479022eb1ac368a871389b635262c505ee368f" - ] - }, - "overrides": [], - "dependencies": ["ansi-regex@3.0.0@d41d8cd9"], - "devDependencies": [] - }, - "strip-ansi@3.0.1@d41d8cd9": { - "id": "strip-ansi@3.0.1@d41d8cd9", - "name": "strip-ansi", - "version": "3.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#sha1:6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - ] - }, - "overrides": [], - "dependencies": ["ansi-regex@2.1.1@d41d8cd9"], - "devDependencies": [] - }, - "stringify-object@3.3.0@d41d8cd9": { - "id": "stringify-object@3.3.0@d41d8cd9", - "name": "stringify-object", - "version": "3.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz#sha1:703065aefca19300d3ce88af4f5b3956d7556629" - ] - }, - "overrides": [], - "dependencies": [ - "is-regexp@1.0.0@d41d8cd9", - "is-obj@1.0.1@d41d8cd9", - "get-own-enumerable-property-symbols@3.0.2@d41d8cd9" - ], - "devDependencies": [] - }, - "string_decoder@1.1.1@d41d8cd9": { - "id": "string_decoder@1.1.1@d41d8cd9", - "name": "string_decoder", - "version": "1.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#sha1:9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - ] - }, - "overrides": [], - "dependencies": ["safe-buffer@5.1.2@d41d8cd9"], - "devDependencies": [] - }, - "string-width@4.2.0@d41d8cd9": { - "id": "string-width@4.2.0@d41d8cd9", - "name": "string-width", - "version": "4.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz#sha1:952182c46cc7b2c313d1596e623992bd163b72b5" - ] - }, - "overrides": [], - "dependencies": [ - "strip-ansi@6.0.0@d41d8cd9", - "is-fullwidth-code-point@3.0.0@d41d8cd9", - "emoji-regex@8.0.0@d41d8cd9" - ], - "devDependencies": [] - }, - "string-width@3.1.0@d41d8cd9": { - "id": "string-width@3.1.0@d41d8cd9", - "name": "string-width", - "version": "3.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz#sha1:22767be21b62af1081574306f69ac51b62203961" - ] - }, - "overrides": [], - "dependencies": [ - "strip-ansi@5.2.0@d41d8cd9", - "is-fullwidth-code-point@2.0.0@d41d8cd9", - "emoji-regex@7.0.3@d41d8cd9" - ], - "devDependencies": [] - }, - "string-width@2.1.1@d41d8cd9": { - "id": "string-width@2.1.1@d41d8cd9", - "name": "string-width", - "version": "2.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#sha1:ab93f27a8dc13d28cac815c462143a6d9012ae9e" - ] - }, - "overrides": [], - "dependencies": [ - "strip-ansi@4.0.0@d41d8cd9", - "is-fullwidth-code-point@2.0.0@d41d8cd9" - ], - "devDependencies": [] - }, - "string-width@1.0.2@d41d8cd9": { - "id": "string-width@1.0.2@d41d8cd9", - "name": "string-width", - "version": "1.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz#sha1:118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - ] - }, - "overrides": [], - "dependencies": [ - "strip-ansi@3.0.1@d41d8cd9", - "is-fullwidth-code-point@1.0.0@d41d8cd9", - "code-point-at@1.1.0@d41d8cd9" - ], - "devDependencies": [] - }, - "string-argv@0.3.1@d41d8cd9": { - "id": "string-argv@0.3.1@d41d8cd9", - "name": "string-argv", - "version": "0.3.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz#sha1:95e2fbec0427ae19184935f816d74aaa4c5c19da" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "ssri@7.1.0@d41d8cd9": { - "id": "ssri@7.1.0@d41d8cd9", - "name": "ssri", - "version": "7.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz#sha1:92c241bf6de82365b5c7fb4bd76e975522e1294d" - ] - }, - "overrides": [], - "dependencies": [ - "minipass@3.1.1@d41d8cd9", - "figgy-pudding@3.5.1@d41d8cd9" - ], - "devDependencies": [] - }, - "socks-proxy-agent@4.0.2@d41d8cd9": { - "id": "socks-proxy-agent@4.0.2@d41d8cd9", - "name": "socks-proxy-agent", - "version": "4.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz#sha1:3c8991f3145b2799e70e11bd5fbc8b1963116386" - ] - }, - "overrides": [], - "dependencies": ["socks@2.3.3@d41d8cd9", "agent-base@4.2.1@d41d8cd9"], - "devDependencies": [] - }, - "socks@2.3.3@d41d8cd9": { - "id": "socks@2.3.3@d41d8cd9", - "name": "socks", - "version": "2.3.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/socks/-/socks-2.3.3.tgz#sha1:01129f0a5d534d2b897712ed8aceab7ee65d78e3" - ] - }, - "overrides": [], - "dependencies": ["smart-buffer@4.1.0@d41d8cd9", "ip@1.1.5@d41d8cd9"], - "devDependencies": [] - }, - "smart-buffer@4.1.0@d41d8cd9": { - "id": "smart-buffer@4.1.0@d41d8cd9", - "name": "smart-buffer", - "version": "4.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz#sha1:91605c25d91652f4661ea69ccf45f1b331ca21ba" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "slice-ansi@0.0.4@d41d8cd9": { - "id": "slice-ansi@0.0.4@d41d8cd9", - "name": "slice-ansi", - "version": "0.0.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz#sha1:edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "signal-exit@3.0.2@d41d8cd9": { - "id": "signal-exit@3.0.2@d41d8cd9", - "name": "signal-exit", - "version": "3.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz#sha1:b5fdc08f1287ea1178628e415e25132b73646c6d" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "shebang-regex@3.0.0@d41d8cd9": { - "id": "shebang-regex@3.0.0@d41d8cd9", - "name": "shebang-regex", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#sha1:ae16f1644d873ecad843b0307b143362d4c42172" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "shebang-regex@1.0.0@d41d8cd9": { - "id": "shebang-regex@1.0.0@d41d8cd9", - "name": "shebang-regex", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#sha1:da42f49740c0b42db2ca9728571cb190c98efea3" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "shebang-command@2.0.0@d41d8cd9": { - "id": "shebang-command@2.0.0@d41d8cd9", - "name": "shebang-command", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#sha1:ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - ] - }, - "overrides": [], - "dependencies": ["shebang-regex@3.0.0@d41d8cd9"], - "devDependencies": [] - }, - "shebang-command@1.2.0@d41d8cd9": { - "id": "shebang-command@1.2.0@d41d8cd9", - "name": "shebang-command", - "version": "1.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz#sha1:44aac65b695b03398968c39f363fee5deafdf1ea" - ] - }, - "overrides": [], - "dependencies": ["shebang-regex@1.0.0@d41d8cd9"], - "devDependencies": [] - }, - "set-blocking@2.0.0@d41d8cd9": { - "id": "set-blocking@2.0.0@d41d8cd9", - "name": "set-blocking", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#sha1:045f9782d011ae9a6803ddd382b24392b3d890f7" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "semver-compare@1.0.0@d41d8cd9": { - "id": "semver-compare@1.0.0@d41d8cd9", - "name": "semver-compare", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz#sha1:0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "semver@5.7.1@d41d8cd9": { - "id": "semver@5.7.1@d41d8cd9", - "name": "semver", - "version": "5.7.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#sha1:a954f931aeba508d307bbf069eff0c01c96116f7" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "safer-buffer@2.1.2@d41d8cd9": { - "id": "safer-buffer@2.1.2@d41d8cd9", - "name": "safer-buffer", - "version": "2.1.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#sha1:44fa161b0187b9549dd84bb91802f9bd8385cd6a" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "safe-buffer@5.1.2@d41d8cd9": { - "id": "safe-buffer@5.1.2@d41d8cd9", - "name": "safe-buffer", - "version": "5.1.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#sha1:991ec69d296e0313747d59bdfd2b745c35f8828d" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "rxjs@6.5.4@d41d8cd9": { - "id": "rxjs@6.5.4@d41d8cd9", - "name": "rxjs", - "version": "6.5.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz#sha1:e0777fe0d184cec7872df147f303572d414e211c" - ] - }, - "overrides": [], - "dependencies": ["tslib@1.11.0@d41d8cd9"], - "devDependencies": [] - }, - "run-queue@1.0.3@d41d8cd9": { - "id": "run-queue@1.0.3@d41d8cd9", - "name": "run-queue", - "version": "1.0.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz#sha1:e848396f057d223f24386924618e25694161ec47" - ] - }, - "overrides": [], - "dependencies": ["aproba@1.2.0@d41d8cd9"], - "devDependencies": [] - }, - "rimraf@2.7.1@d41d8cd9": { - "id": "rimraf@2.7.1@d41d8cd9", - "name": "rimraf", - "version": "2.7.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#sha1:35797f13a7fdadc566142c29d4f07ccad483e3ec" - ] - }, - "overrides": [], - "dependencies": ["glob@7.1.6@d41d8cd9"], - "devDependencies": [] - }, - "retry@0.10.1@d41d8cd9": { - "id": "retry@0.10.1@d41d8cd9", - "name": "retry", - "version": "0.10.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/retry/-/retry-0.10.1.tgz#sha1:e76388d217992c252750241d3d3956fed98d8ff4" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "restore-cursor@2.0.0@d41d8cd9": { - "id": "restore-cursor@2.0.0@d41d8cd9", - "name": "restore-cursor", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz#sha1:9f7ee287f82fd326d4fd162923d62129eee0dfaf" - ] - }, - "overrides": [], - "dependencies": ["signal-exit@3.0.2@d41d8cd9", "onetime@2.0.1@d41d8cd9"], - "devDependencies": [] - }, - "resolve-from@4.0.0@d41d8cd9": { - "id": "resolve-from@4.0.0@d41d8cd9", - "name": "resolve-from", - "version": "4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#sha1:4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "require-main-filename@2.0.0@d41d8cd9": { - "id": "require-main-filename@2.0.0@d41d8cd9", - "name": "require-main-filename", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz#sha1:d0b329ecc7cc0f61649f62215be69af54aa8989b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "require-directory@2.1.1@d41d8cd9": { - "id": "require-directory@2.1.1@d41d8cd9", - "name": "require-directory", - "version": "2.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#sha1:8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "regenerator-runtime@0.13.4@d41d8cd9": { - "id": "regenerator-runtime@0.13.4@d41d8cd9", - "name": "regenerator-runtime", - "version": "0.13.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz#sha1:e96bf612a3362d12bb69f7e8f74ffeab25c7ac91" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "refmterr@3.3.0@d41d8cd9": { - "id": "refmterr@3.3.0@d41d8cd9", - "name": "refmterr", - "version": "3.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/refmterr/-/refmterr-3.3.0.tgz#sha1:45adde80205093c201b491b3c37dd7740c9b036b" - ] - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@reason-native/pastel@0.2.3@d41d8cd9", - "@reason-native/console@0.1.0@d41d8cd9", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/atdgen@opam:2.0.0@46af0360", - "@esy-ocaml/reason@3.5.2@d41d8cd9" - ], - "devDependencies": [] - }, - "readable-stream@2.3.7@d41d8cd9": { - "id": "readable-stream@2.3.7@d41d8cd9", - "name": "readable-stream", - "version": "2.3.7", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz#sha1:1eca1cf711aef814c04f62252a36a62f6cb23b57" - ] - }, - "overrides": [], - "dependencies": [ - "util-deprecate@1.0.2@d41d8cd9", - "string_decoder@1.1.1@d41d8cd9", - "safe-buffer@5.1.2@d41d8cd9", - "process-nextick-args@2.0.1@d41d8cd9", - "isarray@1.0.0@d41d8cd9", - "inherits@2.0.4@d41d8cd9", - "core-util-is@1.0.2@d41d8cd9" - ], - "devDependencies": [] - }, - "react-is@16.13.0@d41d8cd9": { - "id": "react-is@16.13.0@d41d8cd9", - "name": "react-is", - "version": "16.13.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/react-is/-/react-is-16.13.0.tgz#sha1:0f37c3613c34fe6b37cd7f763a0d6293ab15c527" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "pump@3.0.0@d41d8cd9": { - "id": "pump@3.0.0@d41d8cd9", - "name": "pump", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#sha1:b4a2116815bde2f4e1ea602354e8c75565107a64" - ] - }, - "overrides": [], - "dependencies": ["once@1.4.0@d41d8cd9", "end-of-stream@1.4.4@d41d8cd9"], - "devDependencies": [] - }, - "promise-retry@1.1.1@d41d8cd9": { - "id": "promise-retry@1.1.1@d41d8cd9", - "name": "promise-retry", - "version": "1.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz#sha1:6739e968e3051da20ce6497fb2b50f6911df3d6d" - ] - }, - "overrides": [], - "dependencies": ["retry@0.10.1@d41d8cd9", "err-code@1.1.2@d41d8cd9"], - "devDependencies": [] - }, - "promise-inflight@1.0.1@d41d8cd9": { - "id": "promise-inflight@1.0.1@d41d8cd9", - "name": "promise-inflight", - "version": "1.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz#sha1:98472870bf228132fcbdd868129bad12c3c029e3" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "progress@2.0.3@d41d8cd9": { - "id": "progress@2.0.3@d41d8cd9", - "name": "progress", - "version": "2.0.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/progress/-/progress-2.0.3.tgz#sha1:7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "process-nextick-args@2.0.1@d41d8cd9": { - "id": "process-nextick-args@2.0.1@d41d8cd9", - "name": "process-nextick-args", - "version": "2.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#sha1:7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "pretty-format@24.9.0@d41d8cd9": { - "id": "pretty-format@24.9.0@d41d8cd9", - "name": "pretty-format", - "version": "24.9.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz#sha1:12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - ] - }, - "overrides": [], - "dependencies": [ - "react-is@16.13.0@d41d8cd9", - "ansi-styles@3.2.1@d41d8cd9", - "ansi-regex@4.1.0@d41d8cd9", - "@jest/types@24.9.0@d41d8cd9" - ], - "devDependencies": [] - }, - "prettier@1.19.1@d41d8cd9": { - "id": "prettier@1.19.1@d41d8cd9", - "name": "prettier", - "version": "1.19.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz#sha1:f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "please-upgrade-node@3.2.0@d41d8cd9": { - "id": "please-upgrade-node@3.2.0@d41d8cd9", - "name": "please-upgrade-node", - "version": "3.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#sha1:aeddd3f994c933e4ad98b99d9a556efa0e2fe942" - ] - }, - "overrides": [], - "dependencies": ["semver-compare@1.0.0@d41d8cd9"], - "devDependencies": [] - }, - "picomatch@2.2.1@d41d8cd9": { - "id": "picomatch@2.2.1@d41d8cd9", - "name": "picomatch", - "version": "2.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz#sha1:21bac888b6ed8601f831ce7816e335bc779f0a4a" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "pesy@0.4.4@d41d8cd9": { - "id": "pesy@0.4.4@d41d8cd9", - "name": "pesy", - "version": "0.4.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/pesy/-/pesy-0.4.4.tgz#sha1:af7a3f6fc8c33c0c6eb57265be0c14d5715d6b69" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "path-type@4.0.0@d41d8cd9": { - "id": "path-type@4.0.0@d41d8cd9", - "name": "path-type", - "version": "4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#sha1:84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "path-key@3.1.1@d41d8cd9": { - "id": "path-key@3.1.1@d41d8cd9", - "name": "path-key", - "version": "3.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#sha1:581f6ade658cbba65a0d3380de7753295054f375" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "path-key@2.0.1@d41d8cd9": { - "id": "path-key@2.0.1@d41d8cd9", - "name": "path-key", - "version": "2.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#sha1:411cadb574c5a140d3a4b1910d40d80cc9f40b40" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "path-is-absolute@1.0.1@d41d8cd9": { - "id": "path-is-absolute@1.0.1@d41d8cd9", - "name": "path-is-absolute", - "version": "1.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#sha1:174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "path-exists@4.0.0@d41d8cd9": { - "id": "path-exists@4.0.0@d41d8cd9", - "name": "path-exists", - "version": "4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#sha1:513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "path-exists@3.0.0@d41d8cd9": { - "id": "path-exists@3.0.0@d41d8cd9", - "name": "path-exists", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#sha1:ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "parse5-htmlparser2-tree-adapter@5.1.1@d41d8cd9": { - "id": "parse5-htmlparser2-tree-adapter@5.1.1@d41d8cd9", - "name": "parse5-htmlparser2-tree-adapter", - "version": "5.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz#sha1:e8c743d4e92194d5293ecde2b08be31e67461cbc" - ] - }, - "overrides": [], - "dependencies": ["parse5@5.1.1@d41d8cd9"], - "devDependencies": [] - }, - "parse5@5.1.1@d41d8cd9": { - "id": "parse5@5.1.1@d41d8cd9", - "name": "parse5", - "version": "5.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz#sha1:f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "parse-json@5.0.0@d41d8cd9": { - "id": "parse-json@5.0.0@d41d8cd9", - "name": "parse-json", - "version": "5.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz#sha1:73e5114c986d143efa3712d4ea24db9a4266f60f" - ] - }, - "overrides": [], - "dependencies": [ - "lines-and-columns@1.1.6@d41d8cd9", - "json-parse-better-errors@1.0.2@d41d8cd9", - "error-ex@1.3.2@d41d8cd9", - "@babel/code-frame@7.8.3@d41d8cd9" - ], - "devDependencies": [] - }, - "parent-module@1.0.1@d41d8cd9": { - "id": "parent-module@1.0.1@d41d8cd9", - "name": "parent-module", - "version": "1.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#sha1:691d2709e78c79fae3a156622452d00762caaaa2" - ] - }, - "overrides": [], - "dependencies": ["callsites@3.1.0@d41d8cd9"], - "devDependencies": [] - }, - "p-try@2.2.0@d41d8cd9": { - "id": "p-try@2.2.0@d41d8cd9", - "name": "p-try", - "version": "2.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#sha1:cb2868540e313d61de58fafbe35ce9004d5540e6" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "p-map@3.0.0@d41d8cd9": { - "id": "p-map@3.0.0@d41d8cd9", - "name": "p-map", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz#sha1:d704d9af8a2ba684e2600d9a215983d4141a979d" - ] - }, - "overrides": [], - "dependencies": ["aggregate-error@3.0.1@d41d8cd9"], - "devDependencies": [] - }, - "p-map@2.1.0@d41d8cd9": { - "id": "p-map@2.1.0@d41d8cd9", - "name": "p-map", - "version": "2.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz#sha1:310928feef9c9ecc65b68b17693018a665cea175" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "p-locate@4.1.0@d41d8cd9": { - "id": "p-locate@4.1.0@d41d8cd9", - "name": "p-locate", - "version": "4.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#sha1:a3428bb7088b3a60292f66919278b7c297ad4f07" - ] - }, - "overrides": [], - "dependencies": ["p-limit@2.2.2@d41d8cd9"], - "devDependencies": [] - }, - "p-locate@3.0.0@d41d8cd9": { - "id": "p-locate@3.0.0@d41d8cd9", - "name": "p-locate", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz#sha1:322d69a05c0264b25997d9f40cd8a891ab0064a4" - ] - }, - "overrides": [], - "dependencies": ["p-limit@2.2.2@d41d8cd9"], - "devDependencies": [] - }, - "p-limit@2.2.2@d41d8cd9": { - "id": "p-limit@2.2.2@d41d8cd9", - "name": "p-limit", - "version": "2.2.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz#sha1:61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - ] - }, - "overrides": [], - "dependencies": ["p-try@2.2.0@d41d8cd9"], - "devDependencies": [] - }, - "p-finally@2.0.1@d41d8cd9": { - "id": "p-finally@2.0.1@d41d8cd9", - "name": "p-finally", - "version": "2.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz#sha1:bd6fcaa9c559a096b680806f4d657b3f0f240561" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "p-finally@1.0.0@d41d8cd9": { - "id": "p-finally@1.0.0@d41d8cd9", - "name": "p-finally", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#sha1:3fbcfb15b899a44123b34b6dcc18b724336a2cae" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "onetime@5.1.0@d41d8cd9": { - "id": "onetime@5.1.0@d41d8cd9", - "name": "onetime", - "version": "5.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz#sha1:fff0f3c91617fe62bb50189636e99ac8a6df7be5" - ] - }, - "overrides": [], - "dependencies": ["mimic-fn@2.1.0@d41d8cd9"], - "devDependencies": [] - }, - "onetime@2.0.1@d41d8cd9": { - "id": "onetime@2.0.1@d41d8cd9", - "name": "onetime", - "version": "2.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz#sha1:067428230fd67443b2794b22bba528b6867962d4" - ] - }, - "overrides": [], - "dependencies": ["mimic-fn@1.2.0@d41d8cd9"], - "devDependencies": [] - }, - "once@1.4.0@d41d8cd9": { - "id": "once@1.4.0@d41d8cd9", - "name": "once", - "version": "1.4.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/once/-/once-1.4.0.tgz#sha1:583b1aa775961d4b113ac17d9c50baef9dd76bd1" - ] - }, - "overrides": [], - "dependencies": ["wrappy@1.0.2@d41d8cd9"], - "devDependencies": [] - }, - "ocaml@4.8.1000@d41d8cd9": { - "id": "ocaml@4.8.1000@d41d8cd9", - "name": "ocaml", - "version": "4.8.1000", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ocaml/-/ocaml-4.8.1000.tgz#sha1:abc435b5d4ddea2acba8b2df7efb81e2d1690db1" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "object-assign@4.1.1@d41d8cd9": { - "id": "object-assign@4.1.1@d41d8cd9", - "name": "object-assign", - "version": "4.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#sha1:2109adc7965887cfc05cbbd442cac8bfbb360863" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "number-is-nan@1.0.1@d41d8cd9": { - "id": "number-is-nan@1.0.1@d41d8cd9", - "name": "number-is-nan", - "version": "1.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz#sha1:097b602b53422a522c1afb8790318336941a011d" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "npm-run-path@4.0.1@d41d8cd9": { - "id": "npm-run-path@4.0.1@d41d8cd9", - "name": "npm-run-path", - "version": "4.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#sha1:b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - ] - }, - "overrides": [], - "dependencies": ["path-key@3.1.1@d41d8cd9"], - "devDependencies": [] - }, - "npm-run-path@2.0.2@d41d8cd9": { - "id": "npm-run-path@2.0.2@d41d8cd9", - "name": "npm-run-path", - "version": "2.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz#sha1:35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - ] - }, - "overrides": [], - "dependencies": ["path-key@2.0.1@d41d8cd9"], - "devDependencies": [] - }, - "normalize-path@3.0.0@d41d8cd9": { - "id": "normalize-path@3.0.0@d41d8cd9", - "name": "normalize-path", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#sha1:0dcd69ff23a1c9b11fd0978316644a0388216a65" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "normalize-git-url@3.0.2@d41d8cd9": { - "id": "normalize-git-url@3.0.2@d41d8cd9", - "name": "normalize-git-url", - "version": "3.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/normalize-git-url/-/normalize-git-url-3.0.2.tgz#sha1:8e5f14be0bdaedb73e07200310aa416c27350fc4" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "nice-try@1.0.5@d41d8cd9": { - "id": "nice-try@1.0.5@d41d8cd9", - "name": "nice-try", - "version": "1.0.5", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz#sha1:a3378a7696ce7d223e88fc9b764bd7ef1089e366" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "mz@2.7.0@d41d8cd9": { - "id": "mz@2.7.0@d41d8cd9", - "name": "mz", - "version": "2.7.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/mz/-/mz-2.7.0.tgz#sha1:95008057a56cafadc2bc63dde7f9ff6955948e32" - ] - }, - "overrides": [], - "dependencies": [ - "thenify-all@1.6.0@d41d8cd9", - "object-assign@4.1.1@d41d8cd9", - "any-promise@1.3.0@d41d8cd9" - ], - "devDependencies": [] - }, - "ms@2.1.2@d41d8cd9": { - "id": "ms@2.1.2@d41d8cd9", - "name": "ms", - "version": "2.1.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#sha1:d09d1f357b443f493382a8eb3ccd183872ae6009" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "ms@2.0.0@d41d8cd9": { - "id": "ms@2.0.0@d41d8cd9", - "name": "ms", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#sha1:5608aeadfc00be6c2901df5f9861788de0d597c8" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "move-concurrently@1.0.1@d41d8cd9": { - "id": "move-concurrently@1.0.1@d41d8cd9", - "name": "move-concurrently", - "version": "1.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz#sha1:be2c005fda32e0b29af1f05d7c4b33214c701f92" - ] - }, - "overrides": [], - "dependencies": [ - "run-queue@1.0.3@d41d8cd9", - "rimraf@2.7.1@d41d8cd9", - "mkdirp@0.5.1@d41d8cd9", - "fs-write-stream-atomic@1.0.10@d41d8cd9", - "copy-concurrently@1.0.5@d41d8cd9", - "aproba@1.2.0@d41d8cd9" - ], - "devDependencies": [] - }, - "mkdirp@0.5.1@d41d8cd9": { - "id": "mkdirp@0.5.1@d41d8cd9", - "name": "mkdirp", - "version": "0.5.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#sha1:30057438eac6cf7f8c4767f38648d6697d75c903" - ] - }, - "overrides": [], - "dependencies": ["minimist@0.0.8@d41d8cd9"], - "devDependencies": [] - }, - "minizlib@2.1.0@d41d8cd9": { - "id": "minizlib@2.1.0@d41d8cd9", - "name": "minizlib", - "version": "2.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz#sha1:fd52c645301ef09a63a2c209697c294c6ce02cf3" - ] - }, - "overrides": [], - "dependencies": ["yallist@4.0.0@d41d8cd9", "minipass@3.1.1@d41d8cd9"], - "devDependencies": [] - }, - "minipass-sized@1.0.3@d41d8cd9": { - "id": "minipass-sized@1.0.3@d41d8cd9", - "name": "minipass-sized", - "version": "1.0.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz#sha1:70ee5a7c5052070afacfbc22977ea79def353b70" - ] - }, - "overrides": [], - "dependencies": ["minipass@3.1.1@d41d8cd9"], - "devDependencies": [] - }, - "minipass-pipeline@1.2.2@d41d8cd9": { - "id": "minipass-pipeline@1.2.2@d41d8cd9", - "name": "minipass-pipeline", - "version": "1.2.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#sha1:3dcb6bb4a546e32969c7ad710f2c79a86abba93a" - ] - }, - "overrides": [], - "dependencies": ["minipass@3.1.1@d41d8cd9"], - "devDependencies": [] - }, - "minipass-flush@1.0.5@d41d8cd9": { - "id": "minipass-flush@1.0.5@d41d8cd9", - "name": "minipass-flush", - "version": "1.0.5", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz#sha1:82e7135d7e89a50ffe64610a787953c4c4cbb373" - ] - }, - "overrides": [], - "dependencies": ["minipass@3.1.1@d41d8cd9"], - "devDependencies": [] - }, - "minipass-fetch@1.2.1@d41d8cd9": { - "id": "minipass-fetch@1.2.1@d41d8cd9", - "name": "minipass-fetch", - "version": "1.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz#sha1:1b97ecb559be56b09812d45b2e9509f1f59ece2f" - ] - }, - "overrides": [], - "dependencies": [ - "minizlib@2.1.0@d41d8cd9", - "minipass-sized@1.0.3@d41d8cd9", - "minipass-pipeline@1.2.2@d41d8cd9", - "minipass@3.1.1@d41d8cd9", - "encoding@0.1.12@d41d8cd9" - ], - "devDependencies": [] - }, - "minipass-collect@1.0.2@d41d8cd9": { - "id": "minipass-collect@1.0.2@d41d8cd9", - "name": "minipass-collect", - "version": "1.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz#sha1:22b813bf745dc6edba2576b940022ad6edc8c617" - ] - }, - "overrides": [], - "dependencies": ["minipass@3.1.1@d41d8cd9"], - "devDependencies": [] - }, - "minipass@3.1.1@d41d8cd9": { - "id": "minipass@3.1.1@d41d8cd9", - "name": "minipass", - "version": "3.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz#sha1:7607ce778472a185ad6d89082aa2070f79cedcd5" - ] - }, - "overrides": [], - "dependencies": ["yallist@4.0.0@d41d8cd9"], - "devDependencies": [] - }, - "minimist@0.0.8@d41d8cd9": { - "id": "minimist@0.0.8@d41d8cd9", - "name": "minimist", - "version": "0.0.8", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#sha1:857fcabfc3397d2625b8228262e86aa7a011b05d" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "minimatch@3.0.4@d41d8cd9": { - "id": "minimatch@3.0.4@d41d8cd9", - "name": "minimatch", - "version": "3.0.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#sha1:5166e286457f03306064be5497e8dbb0c3d32083" - ] - }, - "overrides": [], - "dependencies": ["brace-expansion@1.1.11@d41d8cd9"], - "devDependencies": [] - }, - "mimic-fn@2.1.0@d41d8cd9": { - "id": "mimic-fn@2.1.0@d41d8cd9", - "name": "mimic-fn", - "version": "2.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#sha1:7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "mimic-fn@1.2.0@d41d8cd9": { - "id": "mimic-fn@1.2.0@d41d8cd9", - "name": "mimic-fn", - "version": "1.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz#sha1:820c86a39334640e99516928bd03fca88057d022" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "micromatch@4.0.2@d41d8cd9": { - "id": "micromatch@4.0.2@d41d8cd9", - "name": "micromatch", - "version": "4.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz#sha1:4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - ] - }, - "overrides": [], - "dependencies": ["picomatch@2.2.1@d41d8cd9", "braces@3.0.2@d41d8cd9"], - "devDependencies": [] - }, - "merge-stream@2.0.0@d41d8cd9": { - "id": "merge-stream@2.0.0@d41d8cd9", - "name": "merge-stream", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#sha1:52823629a14dd00c9770fb6ad47dc6310f2c1f60" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "make-fetch-happen@6.1.0@d41d8cd9": { - "id": "make-fetch-happen@6.1.0@d41d8cd9", - "name": "make-fetch-happen", - "version": "6.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-6.1.0.tgz#sha1:7d3c647913136efd73e94bde899f85fcd3eda09e" - ] - }, - "overrides": [], - "dependencies": [ - "ssri@7.1.0@d41d8cd9", - "socks-proxy-agent@4.0.2@d41d8cd9", - "promise-retry@1.1.1@d41d8cd9", - "minipass-pipeline@1.2.2@d41d8cd9", - "minipass-flush@1.0.5@d41d8cd9", - "minipass-fetch@1.2.1@d41d8cd9", - "minipass-collect@1.0.2@d41d8cd9", - "minipass@3.1.1@d41d8cd9", - "lru-cache@5.1.1@d41d8cd9", - "https-proxy-agent@3.0.1@d41d8cd9", - "http-proxy-agent@2.1.0@d41d8cd9", - "http-cache-semantics@3.8.1@d41d8cd9", - "cacache@13.0.1@d41d8cd9", - "agentkeepalive@3.5.2@d41d8cd9" - ], - "devDependencies": [] - }, - "lru-cache@5.1.1@d41d8cd9": { - "id": "lru-cache@5.1.1@d41d8cd9", - "name": "lru-cache", - "version": "5.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#sha1:1da27e6710271947695daf6848e847f01d84b920" - ] - }, - "overrides": [], - "dependencies": ["yallist@3.1.1@d41d8cd9"], - "devDependencies": [] - }, - "log-update@2.3.0@d41d8cd9": { - "id": "log-update@2.3.0@d41d8cd9", - "name": "log-update", - "version": "2.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz#sha1:88328fd7d1ce7938b29283746f0b1bc126b24708" - ] - }, - "overrides": [], - "dependencies": [ - "wrap-ansi@3.0.1@d41d8cd9", - "cli-cursor@2.1.0@d41d8cd9", - "ansi-escapes@3.2.0@d41d8cd9" - ], - "devDependencies": [] - }, - "log-symbols@3.0.0@d41d8cd9": { - "id": "log-symbols@3.0.0@d41d8cd9", - "name": "log-symbols", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz#sha1:f3a08516a5dea893336a7dee14d18a1cfdab77c4" - ] - }, - "overrides": [], - "dependencies": ["chalk@2.4.2@d41d8cd9"], - "devDependencies": [] - }, - "log-symbols@1.0.2@d41d8cd9": { - "id": "log-symbols@1.0.2@d41d8cd9", - "name": "log-symbols", - "version": "1.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz#sha1:376ff7b58ea3086a0f09facc74617eca501e1a18" - ] - }, - "overrides": [], - "dependencies": ["chalk@1.1.3@d41d8cd9"], - "devDependencies": [] - }, - "locate-path@5.0.0@d41d8cd9": { - "id": "locate-path@5.0.0@d41d8cd9", - "name": "locate-path", - "version": "5.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#sha1:1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - ] - }, - "overrides": [], - "dependencies": ["p-locate@4.1.0@d41d8cd9"], - "devDependencies": [] - }, - "locate-path@3.0.0@d41d8cd9": { - "id": "locate-path@3.0.0@d41d8cd9", - "name": "locate-path", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz#sha1:dbec3b3ab759758071b58fe59fc41871af21400e" - ] - }, - "overrides": [], - "dependencies": ["path-exists@3.0.0@d41d8cd9", "p-locate@3.0.0@d41d8cd9"], - "devDependencies": [] - }, - "listr-verbose-renderer@0.5.0@d41d8cd9": { - "id": "listr-verbose-renderer@0.5.0@d41d8cd9", - "name": "listr-verbose-renderer", - "version": "0.5.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#sha1:f1132167535ea4c1261102b9f28dac7cba1e03db" - ] - }, - "overrides": [], - "dependencies": [ - "figures@2.0.0@d41d8cd9", - "date-fns@1.30.1@d41d8cd9", - "cli-cursor@2.1.0@d41d8cd9", - "chalk@2.4.2@d41d8cd9" - ], - "devDependencies": [] - }, - "listr-update-renderer@0.5.0@d41d8cd9": { - "id": "listr-update-renderer@0.5.0@d41d8cd9", - "name": "listr-update-renderer", - "version": "0.5.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#sha1:4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" - ] - }, - "overrides": [], - "dependencies": [ - "strip-ansi@3.0.1@d41d8cd9", - "log-update@2.3.0@d41d8cd9", - "log-symbols@1.0.2@d41d8cd9", - "listr@0.14.3@d41d8cd9", - "indent-string@3.2.0@d41d8cd9", - "figures@1.7.0@d41d8cd9", - "elegant-spinner@1.0.1@d41d8cd9", - "cli-truncate@0.2.1@d41d8cd9", - "chalk@1.1.3@d41d8cd9" - ], - "devDependencies": [] - }, - "listr-silent-renderer@1.1.1@d41d8cd9": { - "id": "listr-silent-renderer@1.1.1@d41d8cd9", - "name": "listr-silent-renderer", - "version": "1.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#sha1:924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "listr@0.14.3@d41d8cd9": { - "id": "listr@0.14.3@d41d8cd9", - "name": "listr", - "version": "0.14.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/listr/-/listr-0.14.3.tgz#sha1:2fea909604e434be464c50bddba0d496928fa586" - ] - }, - "overrides": [], - "dependencies": [ - "rxjs@6.5.4@d41d8cd9", - "p-map@2.1.0@d41d8cd9", - "listr-verbose-renderer@0.5.0@d41d8cd9", - "listr-update-renderer@0.5.0@d41d8cd9", - "listr-silent-renderer@1.1.1@d41d8cd9", - "is-stream@1.1.0@d41d8cd9", - "is-promise@2.1.0@d41d8cd9", - "is-observable@1.1.0@d41d8cd9", - "@samverschueren/stream-to-observable@0.3.0@d41d8cd9" - ], - "devDependencies": [] - }, - "lint-staged@10.0.8@d41d8cd9": { - "id": "lint-staged@10.0.8@d41d8cd9", - "name": "lint-staged", - "version": "10.0.8", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/lint-staged/-/lint-staged-10.0.8.tgz#sha1:0f7849cdc336061f25f5d4fcbcfa385701ff4739" - ] - }, - "overrides": [], - "dependencies": [ - "stringify-object@3.3.0@d41d8cd9", - "string-argv@0.3.1@d41d8cd9", - "please-upgrade-node@3.2.0@d41d8cd9", - "normalize-path@3.0.0@d41d8cd9", - "micromatch@4.0.2@d41d8cd9", - "log-symbols@3.0.0@d41d8cd9", - "listr@0.14.3@d41d8cd9", - "execa@3.4.0@d41d8cd9", - "dedent@0.7.0@d41d8cd9", - "debug@4.1.1@d41d8cd9", - "cosmiconfig@6.0.0@d41d8cd9", - "commander@4.1.1@d41d8cd9", - "chalk@3.0.0@d41d8cd9" - ], - "devDependencies": [] - }, - "lines-and-columns@1.1.6@d41d8cd9": { - "id": "lines-and-columns@1.1.6@d41d8cd9", - "name": "lines-and-columns", - "version": "1.1.6", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz#sha1:1c00c743b433cd0a4e80758f7b64a57440d9ff00" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "lerna-changelog@1.0.0@d41d8cd9": { - "id": "lerna-changelog@1.0.0@d41d8cd9", - "name": "lerna-changelog", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/lerna-changelog/-/lerna-changelog-1.0.0.tgz#sha1:a3f56d25ca1be8d21e9e5f4a0a51c6bdab9ec9a2" - ] - }, - "overrides": [], - "dependencies": [ - "yargs@13.3.0@d41d8cd9", - "progress@2.0.3@d41d8cd9", - "p-map@3.0.0@d41d8cd9", - "normalize-git-url@3.0.2@d41d8cd9", - "make-fetch-happen@6.1.0@d41d8cd9", - "execa@1.0.0@d41d8cd9", - "cli-highlight@2.1.4@d41d8cd9", - "chalk@2.4.2@d41d8cd9" - ], - "devDependencies": [] - }, - "json-parse-better-errors@1.0.2@d41d8cd9": { - "id": "json-parse-better-errors@1.0.2@d41d8cd9", - "name": "json-parse-better-errors", - "version": "1.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#sha1:bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "js-tokens@4.0.0@d41d8cd9": { - "id": "js-tokens@4.0.0@d41d8cd9", - "name": "js-tokens", - "version": "4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#sha1:19203fb59991df98e3a287050d4647cdeaf32499" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "jest-get-type@24.9.0@d41d8cd9": { - "id": "jest-get-type@24.9.0@d41d8cd9", - "name": "jest-get-type", - "version": "24.9.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz#sha1:1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "jest-diff@24.0.0@d41d8cd9": { - "id": "jest-diff@24.0.0@d41d8cd9", - "name": "jest-diff", - "version": "24.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/jest-diff/-/jest-diff-24.0.0.tgz#sha1:a3e5f573dbac482f7d9513ac9cfa21644d3d6b34" - ] - }, - "overrides": [], - "dependencies": [ - "pretty-format@24.9.0@d41d8cd9", - "jest-get-type@24.9.0@d41d8cd9", - "diff-sequences@24.9.0@d41d8cd9", - "chalk@2.4.2@d41d8cd9" - ], - "devDependencies": [] - }, - "isexe@2.0.0@d41d8cd9": { - "id": "isexe@2.0.0@d41d8cd9", - "name": "isexe", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#sha1:e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "isarray@1.0.0@d41d8cd9": { - "id": "isarray@1.0.0@d41d8cd9", - "name": "isarray", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#sha1:bb935d48582cba168c06834957a54a3e07124f11" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "is-stream@2.0.0@d41d8cd9": { - "id": "is-stream@2.0.0@d41d8cd9", - "name": "is-stream", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz#sha1:bde9c32680d6fae04129d6ac9d921ce7815f78e3" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "is-stream@1.1.0@d41d8cd9": { - "id": "is-stream@1.1.0@d41d8cd9", - "name": "is-stream", - "version": "1.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#sha1:12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "is-regexp@1.0.0@d41d8cd9": { - "id": "is-regexp@1.0.0@d41d8cd9", - "name": "is-regexp", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz#sha1:fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "is-promise@2.1.0@d41d8cd9": { - "id": "is-promise@2.1.0@d41d8cd9", - "name": "is-promise", - "version": "2.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz#sha1:79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "is-observable@1.1.0@d41d8cd9": { - "id": "is-observable@1.1.0@d41d8cd9", - "name": "is-observable", - "version": "1.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz#sha1:b3e986c8f44de950867cab5403f5a3465005975e" - ] - }, - "overrides": [], - "dependencies": ["symbol-observable@1.2.0@d41d8cd9"], - "devDependencies": [] - }, - "is-obj@1.0.1@d41d8cd9": { - "id": "is-obj@1.0.1@d41d8cd9", - "name": "is-obj", - "version": "1.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#sha1:3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "is-number@7.0.0@d41d8cd9": { - "id": "is-number@7.0.0@d41d8cd9", - "name": "is-number", - "version": "7.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#sha1:7535345b896734d5f80c4d06c50955527a14f12b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "is-fullwidth-code-point@3.0.0@d41d8cd9": { - "id": "is-fullwidth-code-point@3.0.0@d41d8cd9", - "name": "is-fullwidth-code-point", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#sha1:f116f8064fe90b3f7844a38997c0b75051269f1d" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "is-fullwidth-code-point@2.0.0@d41d8cd9": { - "id": "is-fullwidth-code-point@2.0.0@d41d8cd9", - "name": "is-fullwidth-code-point", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#sha1:a3b30a5c4f199183167aaab93beefae3ddfb654f" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "is-fullwidth-code-point@1.0.0@d41d8cd9": { - "id": "is-fullwidth-code-point@1.0.0@d41d8cd9", - "name": "is-fullwidth-code-point", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#sha1:ef9e31386f031a7f0d643af82fde50c457ef00cb" - ] - }, - "overrides": [], - "dependencies": ["number-is-nan@1.0.1@d41d8cd9"], - "devDependencies": [] - }, - "is-arrayish@0.2.1@d41d8cd9": { - "id": "is-arrayish@0.2.1@d41d8cd9", - "name": "is-arrayish", - "version": "0.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#sha1:77c99840527aa8ecb1a8ba697b80645a7a926a9d" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "ip@1.1.5@d41d8cd9": { - "id": "ip@1.1.5@d41d8cd9", - "name": "ip", - "version": "1.1.5", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ip/-/ip-1.1.5.tgz#sha1:bdded70114290828c0a039e72ef25f5aaec4354a" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "inherits@2.0.4@d41d8cd9": { - "id": "inherits@2.0.4@d41d8cd9", - "name": "inherits", - "version": "2.0.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#sha1:0fa2c64f932917c3433a0ded55363aae37416b7c" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "inflight@1.0.6@d41d8cd9": { - "id": "inflight@1.0.6@d41d8cd9", - "name": "inflight", - "version": "1.0.6", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#sha1:49bd6331d7d02d0c09bc910a1075ba8165b56df9" - ] - }, - "overrides": [], - "dependencies": ["wrappy@1.0.2@d41d8cd9", "once@1.4.0@d41d8cd9"], - "devDependencies": [] - }, - "infer-owner@1.0.4@d41d8cd9": { - "id": "infer-owner@1.0.4@d41d8cd9", - "name": "infer-owner", - "version": "1.0.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz#sha1:c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "indent-string@4.0.0@d41d8cd9": { - "id": "indent-string@4.0.0@d41d8cd9", - "name": "indent-string", - "version": "4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#sha1:624f8f4497d619b2d9768531d58f4122854d7251" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "indent-string@3.2.0@d41d8cd9": { - "id": "indent-string@3.2.0@d41d8cd9", - "name": "indent-string", - "version": "3.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz#sha1:4a5fd6d27cc332f37e5419a504dbb837105c9289" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "imurmurhash@0.1.4@d41d8cd9": { - "id": "imurmurhash@0.1.4@d41d8cd9", - "name": "imurmurhash", - "version": "0.1.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#sha1:9218b9b2b928a238b13dc4fb6b6d576f231453ea" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "import-fresh@3.2.1@d41d8cd9": { - "id": "import-fresh@3.2.1@d41d8cd9", - "name": "import-fresh", - "version": "3.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz#sha1:633ff618506e793af5ac91bf48b72677e15cbe66" - ] - }, - "overrides": [], - "dependencies": [ - "resolve-from@4.0.0@d41d8cd9", - "parent-module@1.0.1@d41d8cd9" - ], - "devDependencies": [] - }, - "iferr@0.1.5@d41d8cd9": { - "id": "iferr@0.1.5@d41d8cd9", - "name": "iferr", - "version": "0.1.5", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz#sha1:c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "iconv-lite@0.4.24@d41d8cd9": { - "id": "iconv-lite@0.4.24@d41d8cd9", - "name": "iconv-lite", - "version": "0.4.24", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#sha1:2022b4b25fbddc21d2f524974a474aafe733908b" - ] - }, - "overrides": [], - "dependencies": ["safer-buffer@2.1.2@d41d8cd9"], - "devDependencies": [] - }, - "humanize-ms@1.2.1@d41d8cd9": { - "id": "humanize-ms@1.2.1@d41d8cd9", - "name": "humanize-ms", - "version": "1.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz#sha1:c46e3159a293f6b896da29316d8b6fe8bb79bbed" - ] - }, - "overrides": [], - "dependencies": ["ms@2.1.2@d41d8cd9"], - "devDependencies": [] - }, - "human-signals@1.1.1@d41d8cd9": { - "id": "human-signals@1.1.1@d41d8cd9", - "name": "human-signals", - "version": "1.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz#sha1:c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "https-proxy-agent@3.0.1@d41d8cd9": { - "id": "https-proxy-agent@3.0.1@d41d8cd9", - "name": "https-proxy-agent", - "version": "3.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz#sha1:b8c286433e87602311b01c8ea34413d856a4af81" - ] - }, - "overrides": [], - "dependencies": ["debug@3.1.0@d41d8cd9", "agent-base@4.3.0@d41d8cd9"], - "devDependencies": [] - }, - "http-proxy-agent@2.1.0@d41d8cd9": { - "id": "http-proxy-agent@2.1.0@d41d8cd9", - "name": "http-proxy-agent", - "version": "2.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#sha1:e4821beef5b2142a2026bd73926fe537631c5405" - ] - }, - "overrides": [], - "dependencies": ["debug@3.1.0@d41d8cd9", "agent-base@4.3.0@d41d8cd9"], - "devDependencies": [] - }, - "http-cache-semantics@3.8.1@d41d8cd9": { - "id": "http-cache-semantics@3.8.1@d41d8cd9", - "name": "http-cache-semantics", - "version": "3.8.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#sha1:39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "highlight.js@9.18.1@d41d8cd9": { - "id": "highlight.js@9.18.1@d41d8cd9", - "name": "highlight.js", - "version": "9.18.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz#sha1:ed21aa001fe6252bb10a3d76d47573c6539fe13c" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "has-flag@4.0.0@d41d8cd9": { - "id": "has-flag@4.0.0@d41d8cd9", - "name": "has-flag", - "version": "4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#sha1:944771fd9c81c81265c4d6941860da06bb59479b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "has-flag@3.0.0@d41d8cd9": { - "id": "has-flag@3.0.0@d41d8cd9", - "name": "has-flag", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#sha1:b5d454dc2199ae225699f3467e5a07f3b955bafd" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "has-ansi@2.0.0@d41d8cd9": { - "id": "has-ansi@2.0.0@d41d8cd9", - "name": "has-ansi", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz#sha1:34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - ] - }, - "overrides": [], - "dependencies": ["ansi-regex@2.1.1@d41d8cd9"], - "devDependencies": [] - }, - "graceful-fs@4.2.3@d41d8cd9": { - "id": "graceful-fs@4.2.3@d41d8cd9", - "name": "graceful-fs", - "version": "4.2.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz#sha1:4a12ff1b60376ef09862c2093edd908328be8423" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "glob@7.1.6@d41d8cd9": { - "id": "glob@7.1.6@d41d8cd9", - "name": "glob", - "version": "7.1.6", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#sha1:141f33b81a7c2492e125594307480c46679278a6" - ] - }, - "overrides": [], - "dependencies": [ - "path-is-absolute@1.0.1@d41d8cd9", - "once@1.4.0@d41d8cd9", - "minimatch@3.0.4@d41d8cd9", - "inherits@2.0.4@d41d8cd9", - "inflight@1.0.6@d41d8cd9", - "fs.realpath@1.0.0@d41d8cd9" - ], - "devDependencies": [] - }, - "get-stream@5.1.0@d41d8cd9": { - "id": "get-stream@5.1.0@d41d8cd9", - "name": "get-stream", - "version": "5.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz#sha1:01203cdc92597f9b909067c3e656cc1f4d3c4dc9" - ] - }, - "overrides": [], - "dependencies": ["pump@3.0.0@d41d8cd9"], - "devDependencies": [] - }, - "get-stream@4.1.0@d41d8cd9": { - "id": "get-stream@4.1.0@d41d8cd9", - "name": "get-stream", - "version": "4.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz#sha1:c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - ] - }, - "overrides": [], - "dependencies": ["pump@3.0.0@d41d8cd9"], - "devDependencies": [] - }, - "get-own-enumerable-property-symbols@3.0.2@d41d8cd9": { - "id": "get-own-enumerable-property-symbols@3.0.2@d41d8cd9", - "name": "get-own-enumerable-property-symbols", - "version": "3.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#sha1:b5fde77f22cbe35f390b4e089922c50bce6ef664" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "get-caller-file@2.0.5@d41d8cd9": { - "id": "get-caller-file@2.0.5@d41d8cd9", - "name": "get-caller-file", - "version": "2.0.5", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#sha1:4f94412a82db32f36e3b0b9741f8a97feb031f7e" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "fs.realpath@1.0.0@d41d8cd9": { - "id": "fs.realpath@1.0.0@d41d8cd9", - "name": "fs.realpath", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#sha1:1504ad2523158caa40db4a2787cb01411994ea4f" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "fs-write-stream-atomic@1.0.10@d41d8cd9": { - "id": "fs-write-stream-atomic@1.0.10@d41d8cd9", - "name": "fs-write-stream-atomic", - "version": "1.0.10", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#sha1:b47df53493ef911df75731e70a9ded0189db40c9" - ] - }, - "overrides": [], - "dependencies": [ - "readable-stream@2.3.7@d41d8cd9", - "imurmurhash@0.1.4@d41d8cd9", - "iferr@0.1.5@d41d8cd9", - "graceful-fs@4.2.3@d41d8cd9" - ], - "devDependencies": [] - }, - "fs-minipass@2.1.0@d41d8cd9": { - "id": "fs-minipass@2.1.0@d41d8cd9", - "name": "fs-minipass", - "version": "2.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz#sha1:7f5036fdbf12c63c169190cbe4199c852271f9fb" - ] - }, - "overrides": [], - "dependencies": ["minipass@3.1.1@d41d8cd9"], - "devDependencies": [] - }, - "fnm@link-dev:./package.json": { - "id": "fnm@link-dev:./package.json", - "name": "fnm", - "version": "link-dev:./package.json", - "source": { - "type": "link-dev", - "path": ".", - "manifest": "package.json" - }, - "overrides": [], - "dependencies": [ - "refmterr@3.3.0@d41d8cd9", - "pesy@0.4.4@d41d8cd9", - "ocaml@4.8.1000@d41d8cd9", - "@reason-native/rely@3.2.1@d41d8cd9", - "@reason-native/pastel@0.2.3@d41d8cd9", - "@reason-native/console@0.1.0@d41d8cd9", - "@opam/yojson@opam:1.7.0@7056d985", - "@opam/tls@opam:0.10.5@1fd9a963", - "@opam/ppx_let@opam:v0.13.0@5703d2be", - "@opam/ppx_deriving_yojson@opam:3.5.1@06a1c37f", - "@opam/ppx_deriving@opam:4.4.1@208c6c8f", - "@opam/lwt_ppx@opam:2.0.0@9a61dd37", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/lambdasoup@opam:0.7.0@a04ae670", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cohttp-lwt-unix@opam:2.5.1@6d59fe96", - "@opam/cohttp-lwt@opam:2.5.1@addba697", - "@opam/cohttp@opam:2.5.1@6494d505", - "@opam/cmdliner@opam:1.0.4@93208aac", - "@opam/base@opam:v0.13.1@7d937ed0", - "@esy-ocaml/reason@3.5.2@d41d8cd9" - ], - "devDependencies": [ - "prettier@1.19.1@d41d8cd9", - "lint-staged@10.0.8@d41d8cd9", - "lerna-changelog@1.0.0@d41d8cd9", - "jest-diff@24.0.0@d41d8cd9", - "@opam/merlin@opam:3.3.3@d653b06a" - ] - }, - "find-up@4.1.0@d41d8cd9": { - "id": "find-up@4.1.0@d41d8cd9", - "name": "find-up", - "version": "4.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#sha1:97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - ] - }, - "overrides": [], - "dependencies": [ - "path-exists@4.0.0@d41d8cd9", - "locate-path@5.0.0@d41d8cd9" - ], - "devDependencies": [] - }, - "find-up@3.0.0@d41d8cd9": { - "id": "find-up@3.0.0@d41d8cd9", - "name": "find-up", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz#sha1:49169f1d7993430646da61ecc5ae355c21c97b73" - ] - }, - "overrides": [], - "dependencies": ["locate-path@3.0.0@d41d8cd9"], - "devDependencies": [] - }, - "fill-range@7.0.1@d41d8cd9": { - "id": "fill-range@7.0.1@d41d8cd9", - "name": "fill-range", - "version": "7.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#sha1:1919a6a7c75fe38b2c7c77e5198535da9acdda40" - ] - }, - "overrides": [], - "dependencies": ["to-regex-range@5.0.1@d41d8cd9"], - "devDependencies": [] - }, - "figures@2.0.0@d41d8cd9": { - "id": "figures@2.0.0@d41d8cd9", - "name": "figures", - "version": "2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/figures/-/figures-2.0.0.tgz#sha1:3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - ] - }, - "overrides": [], - "dependencies": ["escape-string-regexp@1.0.5@d41d8cd9"], - "devDependencies": [] - }, - "figures@1.7.0@d41d8cd9": { - "id": "figures@1.7.0@d41d8cd9", - "name": "figures", - "version": "1.7.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/figures/-/figures-1.7.0.tgz#sha1:cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - ] - }, - "overrides": [], - "dependencies": [ - "object-assign@4.1.1@d41d8cd9", - "escape-string-regexp@1.0.5@d41d8cd9" - ], - "devDependencies": [] - }, - "figgy-pudding@3.5.1@d41d8cd9": { - "id": "figgy-pudding@3.5.1@d41d8cd9", - "name": "figgy-pudding", - "version": "3.5.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz#sha1:862470112901c727a0e495a80744bd5baa1d6790" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "execa@3.4.0@d41d8cd9": { - "id": "execa@3.4.0@d41d8cd9", - "name": "execa", - "version": "3.4.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/execa/-/execa-3.4.0.tgz#sha1:c08ed4550ef65d858fac269ffc8572446f37eb89" - ] - }, - "overrides": [], - "dependencies": [ - "strip-final-newline@2.0.0@d41d8cd9", - "signal-exit@3.0.2@d41d8cd9", - "p-finally@2.0.1@d41d8cd9", - "onetime@5.1.0@d41d8cd9", - "npm-run-path@4.0.1@d41d8cd9", - "merge-stream@2.0.0@d41d8cd9", - "is-stream@2.0.0@d41d8cd9", - "human-signals@1.1.1@d41d8cd9", - "get-stream@5.1.0@d41d8cd9", - "cross-spawn@7.0.1@d41d8cd9" - ], - "devDependencies": [] - }, - "execa@1.0.0@d41d8cd9": { - "id": "execa@1.0.0@d41d8cd9", - "name": "execa", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/execa/-/execa-1.0.0.tgz#sha1:c6236a5bb4df6d6f15e88e7f017798216749ddd8" - ] - }, - "overrides": [], - "dependencies": [ - "strip-eof@1.0.0@d41d8cd9", - "signal-exit@3.0.2@d41d8cd9", - "p-finally@1.0.0@d41d8cd9", - "npm-run-path@2.0.2@d41d8cd9", - "is-stream@1.1.0@d41d8cd9", - "get-stream@4.1.0@d41d8cd9", - "cross-spawn@6.0.5@d41d8cd9" - ], - "devDependencies": [] - }, - "esutils@2.0.3@d41d8cd9": { - "id": "esutils@2.0.3@d41d8cd9", - "name": "esutils", - "version": "2.0.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#sha1:74d2eb4de0b8da1293711910d50775b9b710ef64" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "escape-string-regexp@1.0.5@d41d8cd9": { - "id": "escape-string-regexp@1.0.5@d41d8cd9", - "name": "escape-string-regexp", - "version": "1.0.5", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#sha1:1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "es6-promisify@5.0.0@d41d8cd9": { - "id": "es6-promisify@5.0.0@d41d8cd9", - "name": "es6-promisify", - "version": "5.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz#sha1:5109d62f3e56ea967c4b63505aef08291c8a5203" - ] - }, - "overrides": [], - "dependencies": ["es6-promise@4.2.8@d41d8cd9"], - "devDependencies": [] - }, - "es6-promise@4.2.8@d41d8cd9": { - "id": "es6-promise@4.2.8@d41d8cd9", - "name": "es6-promise", - "version": "4.2.8", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz#sha1:4eb21594c972bc40553d276e510539143db53e0a" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "error-ex@1.3.2@d41d8cd9": { - "id": "error-ex@1.3.2@d41d8cd9", - "name": "error-ex", - "version": "1.3.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#sha1:b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - ] - }, - "overrides": [], - "dependencies": ["is-arrayish@0.2.1@d41d8cd9"], - "devDependencies": [] - }, - "err-code@1.1.2@d41d8cd9": { - "id": "err-code@1.1.2@d41d8cd9", - "name": "err-code", - "version": "1.1.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz#sha1:06e0116d3028f6aef4806849eb0ea6a748ae6960" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "end-of-stream@1.4.4@d41d8cd9": { - "id": "end-of-stream@1.4.4@d41d8cd9", - "name": "end-of-stream", - "version": "1.4.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#sha1:5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - ] - }, - "overrides": [], - "dependencies": ["once@1.4.0@d41d8cd9"], - "devDependencies": [] - }, - "encoding@0.1.12@d41d8cd9": { - "id": "encoding@0.1.12@d41d8cd9", - "name": "encoding", - "version": "0.1.12", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz#sha1:538b66f3ee62cd1ab51ec323829d1f9480c74beb" - ] - }, - "overrides": [], - "dependencies": ["iconv-lite@0.4.24@d41d8cd9"], - "devDependencies": [] - }, - "emoji-regex@8.0.0@d41d8cd9": { - "id": "emoji-regex@8.0.0@d41d8cd9", - "name": "emoji-regex", - "version": "8.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#sha1:e818fd69ce5ccfcb404594f842963bf53164cc37" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "emoji-regex@7.0.3@d41d8cd9": { - "id": "emoji-regex@7.0.3@d41d8cd9", - "name": "emoji-regex", - "version": "7.0.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz#sha1:933a04052860c85e83c122479c4748a8e4c72156" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "elegant-spinner@1.0.1@d41d8cd9": { - "id": "elegant-spinner@1.0.1@d41d8cd9", - "name": "elegant-spinner", - "version": "1.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz#sha1:db043521c95d7e303fd8f345bedc3349cfb0729e" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "diff-sequences@24.9.0@d41d8cd9": { - "id": "diff-sequences@24.9.0@d41d8cd9", - "name": "diff-sequences", - "version": "24.9.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz#sha1:5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "dedent@0.7.0@d41d8cd9": { - "id": "dedent@0.7.0@d41d8cd9", - "name": "dedent", - "version": "0.7.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz#sha1:2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "decamelize@1.2.0@d41d8cd9": { - "id": "decamelize@1.2.0@d41d8cd9", - "name": "decamelize", - "version": "1.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#sha1:f6534d15148269b20352e7bee26f501f9a191290" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "debug@4.1.1@d41d8cd9": { - "id": "debug@4.1.1@d41d8cd9", - "name": "debug", - "version": "4.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#sha1:3b72260255109c6b589cee050f1d516139664791" - ] - }, - "overrides": [], - "dependencies": ["ms@2.1.2@d41d8cd9"], - "devDependencies": [] - }, - "debug@3.1.0@d41d8cd9": { - "id": "debug@3.1.0@d41d8cd9", - "name": "debug", - "version": "3.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#sha1:5bb5a0672628b64149566ba16819e61518c67261" - ] - }, - "overrides": [], - "dependencies": ["ms@2.0.0@d41d8cd9"], - "devDependencies": [] - }, - "date-fns@1.30.1@d41d8cd9": { - "id": "date-fns@1.30.1@d41d8cd9", - "name": "date-fns", - "version": "1.30.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz#sha1:2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "cross-spawn@7.0.1@d41d8cd9": { - "id": "cross-spawn@7.0.1@d41d8cd9", - "name": "cross-spawn", - "version": "7.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz#sha1:0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" - ] - }, - "overrides": [], - "dependencies": [ - "which@2.0.2@d41d8cd9", - "shebang-command@2.0.0@d41d8cd9", - "path-key@3.1.1@d41d8cd9" - ], - "devDependencies": [] - }, - "cross-spawn@6.0.5@d41d8cd9": { - "id": "cross-spawn@6.0.5@d41d8cd9", - "name": "cross-spawn", - "version": "6.0.5", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz#sha1:4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - ] - }, - "overrides": [], - "dependencies": [ - "which@1.3.1@d41d8cd9", - "shebang-command@1.2.0@d41d8cd9", - "semver@5.7.1@d41d8cd9", - "path-key@2.0.1@d41d8cd9", - "nice-try@1.0.5@d41d8cd9" - ], - "devDependencies": [] - }, - "cosmiconfig@6.0.0@d41d8cd9": { - "id": "cosmiconfig@6.0.0@d41d8cd9", - "name": "cosmiconfig", - "version": "6.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz#sha1:da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - ] - }, - "overrides": [], - "dependencies": [ - "yaml@1.7.2@d41d8cd9", - "path-type@4.0.0@d41d8cd9", - "parse-json@5.0.0@d41d8cd9", - "import-fresh@3.2.1@d41d8cd9", - "@types/parse-json@4.0.0@d41d8cd9" - ], - "devDependencies": [] - }, - "core-util-is@1.0.2@d41d8cd9": { - "id": "core-util-is@1.0.2@d41d8cd9", - "name": "core-util-is", - "version": "1.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz#sha1:b5fd54220aa2bc5ab57aab7140c940754503c1a7" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "copy-concurrently@1.0.5@d41d8cd9": { - "id": "copy-concurrently@1.0.5@d41d8cd9", - "name": "copy-concurrently", - "version": "1.0.5", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz#sha1:92297398cae34937fcafd6ec8139c18051f0b5e0" - ] - }, - "overrides": [], - "dependencies": [ - "run-queue@1.0.3@d41d8cd9", - "rimraf@2.7.1@d41d8cd9", - "mkdirp@0.5.1@d41d8cd9", - "iferr@0.1.5@d41d8cd9", - "fs-write-stream-atomic@1.0.10@d41d8cd9", - "aproba@1.2.0@d41d8cd9" - ], - "devDependencies": [] - }, - "concat-map@0.0.1@d41d8cd9": { - "id": "concat-map@0.0.1@d41d8cd9", - "name": "concat-map", - "version": "0.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#sha1:d8a96bd77fd68df7793a73036a3ba0d5405d477b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "commander@4.1.1@d41d8cd9": { - "id": "commander@4.1.1@d41d8cd9", - "name": "commander", - "version": "4.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/commander/-/commander-4.1.1.tgz#sha1:9fd602bd936294e9e9ef46a3f4d6964044b18068" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "color-name@1.1.4@d41d8cd9": { - "id": "color-name@1.1.4@d41d8cd9", - "name": "color-name", - "version": "1.1.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#sha1:c2a09a87acbde69543de6f63fa3995c826c536a2" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "color-name@1.1.3@d41d8cd9": { - "id": "color-name@1.1.3@d41d8cd9", - "name": "color-name", - "version": "1.1.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#sha1:a7d0558bd89c42f795dd42328f740831ca53bc25" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "color-convert@2.0.1@d41d8cd9": { - "id": "color-convert@2.0.1@d41d8cd9", - "name": "color-convert", - "version": "2.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#sha1:72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - ] - }, - "overrides": [], - "dependencies": ["color-name@1.1.4@d41d8cd9"], - "devDependencies": [] - }, - "color-convert@1.9.3@d41d8cd9": { - "id": "color-convert@1.9.3@d41d8cd9", - "name": "color-convert", - "version": "1.9.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#sha1:bb71850690e1f136567de629d2d5471deda4c1e8" - ] - }, - "overrides": [], - "dependencies": ["color-name@1.1.3@d41d8cd9"], - "devDependencies": [] - }, - "code-point-at@1.1.0@d41d8cd9": { - "id": "code-point-at@1.1.0@d41d8cd9", - "name": "code-point-at", - "version": "1.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz#sha1:0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "cliui@6.0.0@d41d8cd9": { - "id": "cliui@6.0.0@d41d8cd9", - "name": "cliui", - "version": "6.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz#sha1:511d702c0c4e41ca156d7d0e96021f23e13225b1" - ] - }, - "overrides": [], - "dependencies": [ - "wrap-ansi@6.2.0@d41d8cd9", - "strip-ansi@6.0.0@d41d8cd9", - "string-width@4.2.0@d41d8cd9" - ], - "devDependencies": [] - }, - "cliui@5.0.0@d41d8cd9": { - "id": "cliui@5.0.0@d41d8cd9", - "name": "cliui", - "version": "5.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz#sha1:deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - ] - }, - "overrides": [], - "dependencies": [ - "wrap-ansi@5.1.0@d41d8cd9", - "strip-ansi@5.2.0@d41d8cd9", - "string-width@3.1.0@d41d8cd9" - ], - "devDependencies": [] - }, - "cli-truncate@0.2.1@d41d8cd9": { - "id": "cli-truncate@0.2.1@d41d8cd9", - "name": "cli-truncate", - "version": "0.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz#sha1:9f15cfbb0705005369216c626ac7d05ab90dd574" - ] - }, - "overrides": [], - "dependencies": [ - "string-width@1.0.2@d41d8cd9", - "slice-ansi@0.0.4@d41d8cd9" - ], - "devDependencies": [] - }, - "cli-highlight@2.1.4@d41d8cd9": { - "id": "cli-highlight@2.1.4@d41d8cd9", - "name": "cli-highlight", - "version": "2.1.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.4.tgz#sha1:098cb642cf17f42adc1c1145e07f960ec4d7522b" - ] - }, - "overrides": [], - "dependencies": [ - "yargs@15.1.0@d41d8cd9", - "parse5-htmlparser2-tree-adapter@5.1.1@d41d8cd9", - "parse5@5.1.1@d41d8cd9", - "mz@2.7.0@d41d8cd9", - "highlight.js@9.18.1@d41d8cd9", - "chalk@3.0.0@d41d8cd9" - ], - "devDependencies": [] - }, - "cli-cursor@2.1.0@d41d8cd9": { - "id": "cli-cursor@2.1.0@d41d8cd9", - "name": "cli-cursor", - "version": "2.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz#sha1:b35dac376479facc3e94747d41d0d0f5238ffcb5" - ] - }, - "overrides": [], - "dependencies": ["restore-cursor@2.0.0@d41d8cd9"], - "devDependencies": [] - }, - "clean-stack@2.2.0@d41d8cd9": { - "id": "clean-stack@2.2.0@d41d8cd9", - "name": "clean-stack", - "version": "2.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz#sha1:ee8472dbb129e727b31e8a10a427dee9dfe4008b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "chownr@1.1.4@d41d8cd9": { - "id": "chownr@1.1.4@d41d8cd9", - "name": "chownr", - "version": "1.1.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz#sha1:6fc9d7b42d32a583596337666e7d08084da2cc6b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "chalk@3.0.0@d41d8cd9": { - "id": "chalk@3.0.0@d41d8cd9", - "name": "chalk", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz#sha1:3f73c2bf526591f574cc492c51e2456349f844e4" - ] - }, - "overrides": [], - "dependencies": [ - "supports-color@7.1.0@d41d8cd9", - "ansi-styles@4.2.1@d41d8cd9" - ], - "devDependencies": [] - }, - "chalk@2.4.2@d41d8cd9": { - "id": "chalk@2.4.2@d41d8cd9", - "name": "chalk", - "version": "2.4.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#sha1:cd42541677a54333cf541a49108c1432b44c9424" - ] - }, - "overrides": [], - "dependencies": [ - "supports-color@5.5.0@d41d8cd9", - "escape-string-regexp@1.0.5@d41d8cd9", - "ansi-styles@3.2.1@d41d8cd9" - ], - "devDependencies": [] - }, - "chalk@1.1.3@d41d8cd9": { - "id": "chalk@1.1.3@d41d8cd9", - "name": "chalk", - "version": "1.1.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#sha1:a8115c55e4a702fe4d150abd3872822a7e09fc98" - ] - }, - "overrides": [], - "dependencies": [ - "supports-color@2.0.0@d41d8cd9", - "strip-ansi@3.0.1@d41d8cd9", - "has-ansi@2.0.0@d41d8cd9", - "escape-string-regexp@1.0.5@d41d8cd9", - "ansi-styles@2.2.1@d41d8cd9" - ], - "devDependencies": [] - }, - "camelcase@5.3.1@d41d8cd9": { - "id": "camelcase@5.3.1@d41d8cd9", - "name": "camelcase", - "version": "5.3.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#sha1:e3c9b31569e106811df242f715725a1f4c494320" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "callsites@3.1.0@d41d8cd9": { - "id": "callsites@3.1.0@d41d8cd9", - "name": "callsites", - "version": "3.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#sha1:b3630abd8943432f54b3f0519238e33cd7df2f73" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "cacache@13.0.1@d41d8cd9": { - "id": "cacache@13.0.1@d41d8cd9", - "name": "cacache", - "version": "13.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz#sha1:a8000c21697089082f85287a1aec6e382024a71c" - ] - }, - "overrides": [], - "dependencies": [ - "unique-filename@1.1.1@d41d8cd9", - "ssri@7.1.0@d41d8cd9", - "rimraf@2.7.1@d41d8cd9", - "promise-inflight@1.0.1@d41d8cd9", - "p-map@3.0.0@d41d8cd9", - "move-concurrently@1.0.1@d41d8cd9", - "mkdirp@0.5.1@d41d8cd9", - "minipass-pipeline@1.2.2@d41d8cd9", - "minipass-flush@1.0.5@d41d8cd9", - "minipass-collect@1.0.2@d41d8cd9", - "minipass@3.1.1@d41d8cd9", - "lru-cache@5.1.1@d41d8cd9", - "infer-owner@1.0.4@d41d8cd9", - "graceful-fs@4.2.3@d41d8cd9", - "glob@7.1.6@d41d8cd9", - "fs-minipass@2.1.0@d41d8cd9", - "figgy-pudding@3.5.1@d41d8cd9", - "chownr@1.1.4@d41d8cd9" - ], - "devDependencies": [] - }, - "braces@3.0.2@d41d8cd9": { - "id": "braces@3.0.2@d41d8cd9", - "name": "braces", - "version": "3.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#sha1:3454e1a462ee8d599e236df336cd9ea4f8afe107" - ] - }, - "overrides": [], - "dependencies": ["fill-range@7.0.1@d41d8cd9"], - "devDependencies": [] - }, - "brace-expansion@1.1.11@d41d8cd9": { - "id": "brace-expansion@1.1.11@d41d8cd9", - "name": "brace-expansion", - "version": "1.1.11", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#sha1:3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - ] - }, - "overrides": [], - "dependencies": [ - "concat-map@0.0.1@d41d8cd9", - "balanced-match@1.0.0@d41d8cd9" - ], - "devDependencies": [] - }, - "balanced-match@1.0.0@d41d8cd9": { - "id": "balanced-match@1.0.0@d41d8cd9", - "name": "balanced-match", - "version": "1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#sha1:89b4d199ab2bee49de164ea02b89ce462d71b767" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "aproba@1.2.0@d41d8cd9": { - "id": "aproba@1.2.0@d41d8cd9", - "name": "aproba", - "version": "1.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz#sha1:6802e6264efd18c790a1b0d517f0f2627bf2c94a" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "any-promise@1.3.0@d41d8cd9": { - "id": "any-promise@1.3.0@d41d8cd9", - "name": "any-promise", - "version": "1.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#sha1:abc6afeedcea52e809cdc0376aed3ce39635d17f" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "any-observable@0.3.0@d41d8cd9": { - "id": "any-observable@0.3.0@d41d8cd9", - "name": "any-observable", - "version": "0.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz#sha1:af933475e5806a67d0d7df090dd5e8bef65d119b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "ansi-styles@4.2.1@d41d8cd9": { - "id": "ansi-styles@4.2.1@d41d8cd9", - "name": "ansi-styles", - "version": "4.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz#sha1:90ae75c424d008d2624c5bf29ead3177ebfcf359" - ] - }, - "overrides": [], - "dependencies": [ - "color-convert@2.0.1@d41d8cd9", - "@types/color-name@1.1.1@d41d8cd9" - ], - "devDependencies": [] - }, - "ansi-styles@3.2.1@d41d8cd9": { - "id": "ansi-styles@3.2.1@d41d8cd9", - "name": "ansi-styles", - "version": "3.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#sha1:41fbb20243e50b12be0f04b8dedbf07520ce841d" - ] - }, - "overrides": [], - "dependencies": ["color-convert@1.9.3@d41d8cd9"], - "devDependencies": [] - }, - "ansi-styles@2.2.1@d41d8cd9": { - "id": "ansi-styles@2.2.1@d41d8cd9", - "name": "ansi-styles", - "version": "2.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz#sha1:b432dd3358b634cf75e1e4664368240533c1ddbe" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "ansi-regex@5.0.0@d41d8cd9": { - "id": "ansi-regex@5.0.0@d41d8cd9", - "name": "ansi-regex", - "version": "5.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz#sha1:388539f55179bf39339c81af30a654d69f87cb75" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "ansi-regex@4.1.0@d41d8cd9": { - "id": "ansi-regex@4.1.0@d41d8cd9", - "name": "ansi-regex", - "version": "4.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz#sha1:8b9f8f08cf1acb843756a839ca8c7e3168c51997" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "ansi-regex@3.0.0@d41d8cd9": { - "id": "ansi-regex@3.0.0@d41d8cd9", - "name": "ansi-regex", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz#sha1:ed0317c322064f79466c02966bddb605ab37d998" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "ansi-regex@2.1.1@d41d8cd9": { - "id": "ansi-regex@2.1.1@d41d8cd9", - "name": "ansi-regex", - "version": "2.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz#sha1:c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "ansi-escapes@3.2.0@d41d8cd9": { - "id": "ansi-escapes@3.2.0@d41d8cd9", - "name": "ansi-escapes", - "version": "3.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#sha1:8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "aggregate-error@3.0.1@d41d8cd9": { - "id": "aggregate-error@3.0.1@d41d8cd9", - "name": "aggregate-error", - "version": "3.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz#sha1:db2fe7246e536f40d9b5442a39e117d7dd6a24e0" - ] - }, - "overrides": [], - "dependencies": [ - "indent-string@4.0.0@d41d8cd9", - "clean-stack@2.2.0@d41d8cd9" - ], - "devDependencies": [] - }, - "agentkeepalive@3.5.2@d41d8cd9": { - "id": "agentkeepalive@3.5.2@d41d8cd9", - "name": "agentkeepalive", - "version": "3.5.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz#sha1:a113924dd3fa24a0bc3b78108c450c2abee00f67" - ] - }, - "overrides": [], - "dependencies": ["humanize-ms@1.2.1@d41d8cd9"], - "devDependencies": [] - }, - "agent-base@4.3.0@d41d8cd9": { - "id": "agent-base@4.3.0@d41d8cd9", - "name": "agent-base", - "version": "4.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz#sha1:8165f01c436009bccad0b1d122f05ed770efc6ee" - ] - }, - "overrides": [], - "dependencies": ["es6-promisify@5.0.0@d41d8cd9"], - "devDependencies": [] - }, - "agent-base@4.2.1@d41d8cd9": { - "id": "agent-base@4.2.1@d41d8cd9", - "name": "agent-base", - "version": "4.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz#sha1:d89e5999f797875674c07d87f260fc41e83e8ca9" - ] - }, - "overrides": [], - "dependencies": ["es6-promisify@5.0.0@d41d8cd9"], - "devDependencies": [] - }, - "@types/yargs-parser@15.0.0@d41d8cd9": { - "id": "@types/yargs-parser@15.0.0@d41d8cd9", - "name": "@types/yargs-parser", - "version": "15.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#sha1:cb3f9f741869e20cce330ffbeb9271590483882d" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "@types/yargs@13.0.8@d41d8cd9": { - "id": "@types/yargs@13.0.8@d41d8cd9", - "name": "@types/yargs", - "version": "13.0.8", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@types/yargs/-/yargs-13.0.8.tgz#sha1:a38c22def2f1c2068f8971acb3ea734eb3c64a99" - ] - }, - "overrides": [], - "dependencies": ["@types/yargs-parser@15.0.0@d41d8cd9"], - "devDependencies": [] - }, - "@types/parse-json@4.0.0@d41d8cd9": { - "id": "@types/parse-json@4.0.0@d41d8cd9", - "name": "@types/parse-json", - "version": "4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz#sha1:2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "@types/istanbul-reports@1.1.1@d41d8cd9": { - "id": "@types/istanbul-reports@1.1.1@d41d8cd9", - "name": "@types/istanbul-reports", - "version": "1.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#sha1:7a8cbf6a406f36c8add871625b278eaf0b0d255a" - ] - }, - "overrides": [], - "dependencies": [ - "@types/istanbul-lib-report@3.0.0@d41d8cd9", - "@types/istanbul-lib-coverage@2.0.1@d41d8cd9" - ], - "devDependencies": [] - }, - "@types/istanbul-lib-report@3.0.0@d41d8cd9": { - "id": "@types/istanbul-lib-report@3.0.0@d41d8cd9", - "name": "@types/istanbul-lib-report", - "version": "3.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#sha1:c14c24f18ea8190c118ee7562b7ff99a36552686" - ] - }, - "overrides": [], - "dependencies": ["@types/istanbul-lib-coverage@2.0.1@d41d8cd9"], - "devDependencies": [] - }, - "@types/istanbul-lib-coverage@2.0.1@d41d8cd9": { - "id": "@types/istanbul-lib-coverage@2.0.1@d41d8cd9", - "name": "@types/istanbul-lib-coverage", - "version": "2.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#sha1:42995b446db9a48a11a07ec083499a860e9138ff" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "@types/color-name@1.1.1@d41d8cd9": { - "id": "@types/color-name@1.1.1@d41d8cd9", - "name": "@types/color-name", - "version": "1.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz#sha1:1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "@samverschueren/stream-to-observable@0.3.0@d41d8cd9": { - "id": "@samverschueren/stream-to-observable@0.3.0@d41d8cd9", - "name": "@samverschueren/stream-to-observable", - "version": "0.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#sha1:ecdf48d532c58ea477acfcab80348424f8d0662f" - ] - }, - "overrides": [], - "dependencies": ["any-observable@0.3.0@d41d8cd9"], - "devDependencies": [] - }, - "@reason-native/rely@3.2.1@d41d8cd9": { - "id": "@reason-native/rely@3.2.1@d41d8cd9", - "name": "@reason-native/rely", - "version": "3.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@reason-native/rely/-/rely-3.2.1.tgz#sha1:7945ac6a51773a97b8f8cfd97d2855ac7ac4ecb2" - ] - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@reason-native/pastel@0.2.3@d41d8cd9", - "@reason-native/file-context-printer@0.0.3@d41d8cd9", - "@reason-native/cli@0.0.1-alpha@d41d8cd9", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/junit@opam:2.0.2@0b7bd730", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/reason@3.5.2@d41d8cd9" - ], - "devDependencies": [] - }, - "@reason-native/pastel@0.2.3@d41d8cd9": { - "id": "@reason-native/pastel@0.2.3@d41d8cd9", - "name": "@reason-native/pastel", - "version": "0.2.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@reason-native/pastel/-/pastel-0.2.3.tgz#sha1:5c5d420c09874584ce15a38695c5dfd0f0ff5dfa" - ] - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/reason@3.5.2@d41d8cd9" - ], - "devDependencies": [] - }, - "@reason-native/file-context-printer@0.0.3@d41d8cd9": { - "id": "@reason-native/file-context-printer@0.0.3@d41d8cd9", - "name": "@reason-native/file-context-printer", - "version": "0.0.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@reason-native/file-context-printer/-/file-context-printer-0.0.3.tgz#sha1:b92eec7b10107ccb27528f9eea9bb51252bca491" - ] - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@reason-native/pastel@0.2.3@d41d8cd9", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/reason@3.5.2@d41d8cd9" - ], - "devDependencies": [] - }, - "@reason-native/console@0.1.0@d41d8cd9": { - "id": "@reason-native/console@0.1.0@d41d8cd9", - "name": "@reason-native/console", - "version": "0.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@reason-native/console/-/console-0.1.0.tgz#sha1:3b56f0e9e1be8464329793df29020aa90e71c22c" - ] - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/reason@3.5.2@d41d8cd9" - ], - "devDependencies": [] - }, - "@reason-native/cli@0.0.1-alpha@d41d8cd9": { - "id": "@reason-native/cli@0.0.1-alpha@d41d8cd9", - "name": "@reason-native/cli", - "version": "0.0.1-alpha", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@reason-native/cli/-/cli-0.0.1-alpha.tgz#sha1:0b911053fa7cc661eac10ead50d6ea6cc1fcd94d" - ] - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@reason-native/pastel@0.2.3@d41d8cd9", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/reason@3.5.2@d41d8cd9" - ], - "devDependencies": [] - }, - "@opam/zarith@opam:1.9.1@ce833113": { - "id": "@opam/zarith@opam:1.9.1@ce833113", - "name": "@opam/zarith", - "version": "opam:1.9.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/af/af41b7534a4c91a8f774f04e307c1c66#md5:af41b7534a4c91a8f774f04e307c1c66", - "archive:https://github.com/ocaml/Zarith/archive/release-1.9.1.tar.gz#md5:af41b7534a4c91a8f774f04e307c1c66" - ], - "opam": { - "name": "zarith", - "version": "1.9.1", - "path": "esy.lock/opam/zarith.1.9.1" - } - }, - "overrides": [ - { - "opamoverride": "esy.lock/overrides/opam__s__zarith_opam__c__1.9.1_opam_override" - } - ], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/conf-perl@opam:1@a6896ba6", - "@opam/conf-gmp@archive:https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz#sha1:9dc6981197a7d92f339192eea974f5eca48fcffe@7e96a8d6", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/conf-gmp@archive:https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz#sha1:9dc6981197a7d92f339192eea974f5eca48fcffe@7e96a8d6" - ] - }, - "@opam/yojson@opam:1.7.0@7056d985": { - "id": "@opam/yojson@opam:1.7.0@7056d985", - "name": "@opam/yojson", - "version": "opam:1.7.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/b8/b89d39ca3f8c532abe5f547ad3b8f84d#md5:b89d39ca3f8c532abe5f547ad3b8f84d", - "archive:https://github.com/ocaml-community/yojson/releases/download/1.7.0/yojson-1.7.0.tbz#md5:b89d39ca3f8c532abe5f547ad3b8f84d" - ], - "opam": { - "name": "yojson", - "version": "1.7.0", - "path": "esy.lock/opam/yojson.1.7.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/easy-format@opam:1.3.2@0484b3c4", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cppo@opam:1.6.6@f4f83858", - "@opam/biniou@opam:1.2.1@d7570399", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/easy-format@opam:1.3.2@0484b3c4", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/biniou@opam:1.2.1@d7570399" - ] - }, - "@opam/x509@opam:0.8.1@9fe96f81": { - "id": "@opam/x509@opam:0.8.1@9fe96f81", - "name": "@opam/x509", - "version": "opam:0.8.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/a5/a586b925fe7e84b1a5833dacf66a920967683cf8aab21d7291a3074630e57880#sha256:a586b925fe7e84b1a5833dacf66a920967683cf8aab21d7291a3074630e57880", - "archive:https://github.com/mirleft/ocaml-x509/releases/download/v0.8.1/x509-v0.8.1.tbz#sha256:a586b925fe7e84b1a5833dacf66a920967683cf8aab21d7291a3074630e57880" - ], - "opam": { - "name": "x509", - "version": "0.8.1", - "path": "esy.lock/opam/x509.0.8.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/rresult@opam:0.6.0@4b185e72", - "@opam/ptime@opam:0.8.5@0051d642", - "@opam/nocrypto@opam:0.5.4-2@723e1f42", - "@opam/gmap@opam:0.3.0@599a6bf7", - "@opam/fmt@opam:0.8.8@01c3a23c", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/domain-name@opam:0.3.0@af116067", - "@opam/cstruct@opam:5.1.1@e0b5aafd", - "@opam/asn1-combinators@opam:0.2.2@61f661eb", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/rresult@opam:0.6.0@4b185e72", - "@opam/ptime@opam:0.8.5@0051d642", - "@opam/nocrypto@opam:0.5.4-2@723e1f42", - "@opam/gmap@opam:0.3.0@599a6bf7", - "@opam/fmt@opam:0.8.8@01c3a23c", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/domain-name@opam:0.3.0@af116067", - "@opam/cstruct@opam:5.1.1@e0b5aafd", - "@opam/asn1-combinators@opam:0.2.2@61f661eb" - ] - }, - "@opam/uutf@opam:1.0.2@4440868f": { - "id": "@opam/uutf@opam:1.0.2@4440868f", - "name": "@opam/uutf", - "version": "opam:1.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/a7/a7c542405a39630c689a82bd7ef2292c#md5:a7c542405a39630c689a82bd7ef2292c", - "archive:http://erratique.ch/software/uutf/releases/uutf-1.0.2.tbz#md5:a7c542405a39630c689a82bd7ef2292c" - ], - "opam": { - "name": "uutf", - "version": "1.0.2", - "path": "esy.lock/opam/uutf.1.0.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uchar@opam:0.0.2@c8218eea", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@opam/cmdliner@opam:1.0.4@93208aac", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uchar@opam:0.0.2@c8218eea" - ] - }, - "@opam/uri-sexp@opam:3.1.0@f97bddff": { - "id": "@opam/uri-sexp@opam:3.1.0@f97bddff", - "name": "@opam/uri-sexp", - "version": "opam:3.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/c4/c452823fd870cf7cffe51aef3e9ca646a382dc6f87282f2b16bfe30a7515ac43#sha256:c452823fd870cf7cffe51aef3e9ca646a382dc6f87282f2b16bfe30a7515ac43", - "archive:https://github.com/mirage/ocaml-uri/releases/download/v3.1.0/uri-v3.1.0.tbz#sha256:c452823fd870cf7cffe51aef3e9ca646a382dc6f87282f2b16bfe30a7515ac43" - ], - "opam": { - "name": "uri-sexp", - "version": "3.1.0", - "path": "esy.lock/opam/uri-sexp.3.1.0" - } - }, - "overrides": [], - "dependencies": [ - "@opam/uri@opam:3.1.0@d38ac0ae", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "@opam/uri@opam:3.1.0@d38ac0ae", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/uri@opam:3.1.0@d38ac0ae": { - "id": "@opam/uri@opam:3.1.0@d38ac0ae", - "name": "@opam/uri", - "version": "opam:3.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/c4/c452823fd870cf7cffe51aef3e9ca646a382dc6f87282f2b16bfe30a7515ac43#sha256:c452823fd870cf7cffe51aef3e9ca646a382dc6f87282f2b16bfe30a7515ac43", - "archive:https://github.com/mirage/ocaml-uri/releases/download/v3.1.0/uri-v3.1.0.tbz#sha256:c452823fd870cf7cffe51aef3e9ca646a382dc6f87282f2b16bfe30a7515ac43" - ], - "opam": { - "name": "uri", - "version": "3.1.0", - "path": "esy.lock/opam/uri.3.1.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/stringext@opam:1.6.0@104bc94b", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/stringext@opam:1.6.0@104bc94b", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/uchar@opam:0.0.2@c8218eea": { - "id": "@opam/uchar@opam:0.0.2@c8218eea", - "name": "@opam/uchar", - "version": "opam:0.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/c9/c9ba2c738d264c420c642f7bb1cf4a36#md5:c9ba2c738d264c420c642f7bb1cf4a36", - "archive:https://github.com/ocaml/uchar/releases/download/v0.0.2/uchar-0.0.2.tbz#md5:c9ba2c738d264c420c642f7bb1cf4a36" - ], - "opam": { - "name": "uchar", - "version": "0.0.2", - "path": "esy.lock/opam/uchar.0.0.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": ["ocaml@4.8.1000@d41d8cd9"] - }, - "@opam/tyxml@opam:4.3.0@c1da25f1": { - "id": "@opam/tyxml@opam:4.3.0@c1da25f1", - "name": "@opam/tyxml", - "version": "opam:4.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/fd/fd834a567f813bf447cab5f4c3a723e2#md5:fd834a567f813bf447cab5f4c3a723e2", - "archive:https://github.com/ocsigen/tyxml/releases/download/4.3.0/tyxml-4.3.0.tbz#md5:fd834a567f813bf447cab5f4c3a723e2" - ], - "opam": { - "name": "tyxml", - "version": "4.3.0", - "path": "esy.lock/opam/tyxml.4.3.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uutf@opam:1.0.2@4440868f", - "@opam/seq@opam:base@d8d7de1d", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uutf@opam:1.0.2@4440868f", - "@opam/seq@opam:base@d8d7de1d", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/topkg@opam:1.0.1@a42c631e": { - "id": "@opam/topkg@opam:1.0.1@a42c631e", - "name": "@opam/topkg", - "version": "opam:1.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/16/16b90e066d8972a5ef59655e7c28b3e9#md5:16b90e066d8972a5ef59655e7c28b3e9", - "archive:http://erratique.ch/software/topkg/releases/topkg-1.0.1.tbz#md5:16b90e066d8972a5ef59655e7c28b3e9" - ], - "opam": { - "name": "topkg", - "version": "1.0.1", - "path": "esy.lock/opam/topkg.1.0.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03" - ] - }, - "@opam/tls@opam:0.10.5@1fd9a963": { - "id": "@opam/tls@opam:0.10.5@1fd9a963", - "name": "@opam/tls", - "version": "opam:0.10.5", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/57/57d9477ea79080e9d2485007289cbc5f#md5:57d9477ea79080e9d2485007289cbc5f", - "archive:https://github.com/mirleft/ocaml-tls/releases/download/v0.10.5/tls-0.10.5.tbz#md5:57d9477ea79080e9d2485007289cbc5f" - ], - "opam": { - "name": "tls", - "version": "0.10.5", - "path": "esy.lock/opam/tls.0.10.5" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/x509@opam:0.8.1@9fe96f81", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/ptime@opam:0.8.5@0051d642", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/ppx_deriving@opam:4.4.1@208c6c8f", - "@opam/ppx_cstruct@opam:5.1.1@88b3aa4e", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@opam/nocrypto@opam:0.5.4-2@723e1f42", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/fmt@opam:0.8.8@01c3a23c", - "@opam/domain-name@opam:0.3.0@af116067", - "@opam/cstruct-sexp@opam:5.1.1@58ce0491", - "@opam/cstruct@opam:5.1.1@e0b5aafd", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/x509@opam:0.8.1@9fe96f81", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/ppx_deriving@opam:4.4.1@208c6c8f", - "@opam/ppx_cstruct@opam:5.1.1@88b3aa4e", - "@opam/nocrypto@opam:0.5.4-2@723e1f42", - "@opam/fmt@opam:0.8.8@01c3a23c", - "@opam/domain-name@opam:0.3.0@af116067", - "@opam/cstruct-sexp@opam:5.1.1@58ce0491", - "@opam/cstruct@opam:5.1.1@e0b5aafd" - ] - }, - "@opam/stringext@opam:1.6.0@104bc94b": { - "id": "@opam/stringext@opam:1.6.0@104bc94b", - "name": "@opam/stringext", - "version": "opam:1.6.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/db/db41f5d52e9eab17615f110b899dfeb27dd7e7f89cd35ae43827c5119db206ea#sha256:db41f5d52e9eab17615f110b899dfeb27dd7e7f89cd35ae43827c5119db206ea", - "archive:https://github.com/rgrinberg/stringext/releases/download/1.6.0/stringext-1.6.0.tbz#sha256:db41f5d52e9eab17615f110b899dfeb27dd7e7f89cd35ae43827c5119db206ea" - ], - "opam": { - "name": "stringext", - "version": "1.6.0", - "path": "esy.lock/opam/stringext.1.6.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base-bytes@opam:base@19d0c2ff", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base-bytes@opam:base@19d0c2ff" - ] - }, - "@opam/stdlib-shims@opam:0.1.0@d957c903": { - "id": "@opam/stdlib-shims@opam:0.1.0@d957c903", - "name": "@opam/stdlib-shims", - "version": "opam:0.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/12/12b5704eed70c6bff5ac39a16db1425d#md5:12b5704eed70c6bff5ac39a16db1425d", - "archive:https://github.com/ocaml/stdlib-shims/releases/download/0.1.0/stdlib-shims-0.1.0.tbz#md5:12b5704eed70c6bff5ac39a16db1425d" - ], - "opam": { - "name": "stdlib-shims", - "version": "0.1.0", - "path": "esy.lock/opam/stdlib-shims.0.1.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/stdio@opam:v0.13.0@eb59d879": { - "id": "@opam/stdio@opam:v0.13.0@eb59d879", - "name": "@opam/stdio", - "version": "opam:v0.13.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/48/48ef28512ddd51ff9885649dd1fab91d#md5:48ef28512ddd51ff9885649dd1fab91d", - "archive:https://ocaml.janestreet.com/ocaml-core/v0.13/files/stdio-v0.13.0.tar.gz#md5:48ef28512ddd51ff9885649dd1fab91d" - ], - "opam": { - "name": "stdio", - "version": "v0.13.0", - "path": "esy.lock/opam/stdio.v0.13.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0" - ] - }, - "@opam/sexplib0@opam:v0.13.0@3f54c2be": { - "id": "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "name": "@opam/sexplib0", - "version": "opam:v0.13.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/f8/f8a715dffda5599cfae0cb4031d57abe#md5:f8a715dffda5599cfae0cb4031d57abe", - "archive:https://ocaml.janestreet.com/ocaml-core/v0.13/files/sexplib0-v0.13.0.tar.gz#md5:f8a715dffda5599cfae0cb4031d57abe" - ], - "opam": { - "name": "sexplib0", - "version": "v0.13.0", - "path": "esy.lock/opam/sexplib0.v0.13.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/sexplib@opam:v0.13.0@79086695": { - "id": "@opam/sexplib@opam:v0.13.0@79086695", - "name": "@opam/sexplib", - "version": "opam:v0.13.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/d3/d3dd8eb6f10e64e6766217bf6b57bc93#md5:d3dd8eb6f10e64e6766217bf6b57bc93", - "archive:https://ocaml.janestreet.com/ocaml-core/v0.13/files/sexplib-v0.13.0.tar.gz#md5:d3dd8eb6f10e64e6766217bf6b57bc93" - ], - "opam": { - "name": "sexplib", - "version": "v0.13.0", - "path": "esy.lock/opam/sexplib.v0.13.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/parsexp@opam:v0.13.0@5b4df040", - "@opam/num@opam:1.3@43fe4f7f", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/parsexp@opam:v0.13.0@5b4df040", - "@opam/num@opam:1.3@43fe4f7f", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/seq@opam:base@d8d7de1d": { - "id": "@opam/seq@opam:base@d8d7de1d", - "name": "@opam/seq", - "version": "opam:base", - "source": { - "type": "install", - "source": ["no-source:"], - "opam": { - "name": "seq", - "version": "base", - "path": "esy.lock/opam/seq.base" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": ["ocaml@4.8.1000@d41d8cd9"] - }, - "@opam/rresult@opam:0.6.0@4b185e72": { - "id": "@opam/rresult@opam:0.6.0@4b185e72", - "name": "@opam/rresult", - "version": "opam:0.6.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/ab/aba88cffa29081714468c2c7bcdf7fb1#md5:aba88cffa29081714468c2c7bcdf7fb1", - "archive:http://erratique.ch/software/rresult/releases/rresult-0.6.0.tbz#md5:aba88cffa29081714468c2c7bcdf7fb1" - ], - "opam": { - "name": "rresult", - "version": "0.6.0", - "path": "esy.lock/opam/rresult.0.6.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/result@opam:1.5@6b753c82", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/result@opam:1.5@6b753c82" - ] - }, - "@opam/result@opam:1.5@6b753c82": { - "id": "@opam/result@opam:1.5@6b753c82", - "name": "@opam/result", - "version": "opam:1.5", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/1b/1b82dec78849680b49ae9a8a365b831b#md5:1b82dec78849680b49ae9a8a365b831b", - "archive:https://github.com/janestreet/result/releases/download/1.5/result-1.5.tbz#md5:1b82dec78849680b49ae9a8a365b831b" - ], - "opam": { - "name": "result", - "version": "1.5", - "path": "esy.lock/opam/result.1.5" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/re@opam:1.9.0@d4d5e13d": { - "id": "@opam/re@opam:1.9.0@d4d5e13d", - "name": "@opam/re", - "version": "opam:1.9.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/bd/bddaed4f386a22cace7850c9c7dac296#md5:bddaed4f386a22cace7850c9c7dac296", - "archive:https://github.com/ocaml/ocaml-re/releases/download/1.9.0/re-1.9.0.tbz#md5:bddaed4f386a22cace7850c9c7dac296" - ], - "opam": { - "name": "re", - "version": "1.9.0", - "path": "esy.lock/opam/re.1.9.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/seq@opam:base@d8d7de1d", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/seq@opam:base@d8d7de1d", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/ptime@opam:0.8.5@0051d642": { - "id": "@opam/ptime@opam:0.8.5@0051d642", - "name": "@opam/ptime", - "version": "opam:0.8.5", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/4d/4d48055d623ecf2db792439b3e96a520#md5:4d48055d623ecf2db792439b3e96a520", - "archive:https://erratique.ch/software/ptime/releases/ptime-0.8.5.tbz#md5:4d48055d623ecf2db792439b3e96a520" - ], - "opam": { - "name": "ptime", - "version": "0.8.5", - "path": "esy.lock/opam/ptime.0.8.5" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/result@opam:1.5@6b753c82", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/result@opam:1.5@6b753c82" - ] - }, - "@opam/ppxlib@opam:0.12.0@fcf5cabc": { - "id": "@opam/ppxlib@opam:0.12.0@fcf5cabc", - "name": "@opam/ppxlib", - "version": "opam:0.12.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/6b/6b562c9b3b9350777318729921f890850b385c469db60769aafd9371998a2c42#sha256:6b562c9b3b9350777318729921f890850b385c469db60769aafd9371998a2c42", - "archive:https://github.com/ocaml-ppx/ppxlib/archive/0.12.0.tar.gz#sha256:6b562c9b3b9350777318729921f890850b385c469db60769aafd9371998a2c42" - ], - "opam": { - "name": "ppxlib", - "version": "0.12.0", - "path": "esy.lock/opam/ppxlib.0.12.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/stdio@opam:v0.13.0@eb59d879", - "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/ocaml-compiler-libs@opam:v0.12.1@5c34eb0d", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/stdio@opam:v0.13.0@eb59d879", - "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/ocaml-compiler-libs@opam:v0.12.1@5c34eb0d", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0" - ] - }, - "@opam/ppxfind@opam:1.4@c51fd7bf": { - "id": "@opam/ppxfind@opam:1.4@c51fd7bf", - "name": "@opam/ppxfind", - "version": "opam:1.4", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/98/98291c69f04f7f7b7cdad1b5d786c70fc595559d4663cc04cb711ac132db4971#sha256:98291c69f04f7f7b7cdad1b5d786c70fc595559d4663cc04cb711ac132db4971", - "archive:https://github.com/diml/ppxfind/releases/download/1.4/ppxfind-1.4.tbz#sha256:98291c69f04f7f7b7cdad1b5d786c70fc595559d4663cc04cb711ac132db4971" - ], - "opam": { - "name": "ppxfind", - "version": "1.4", - "path": "esy.lock/opam/ppxfind.1.4" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/ppx_tools_versioned@opam:5.2.3@4994ec80": { - "id": "@opam/ppx_tools_versioned@opam:5.2.3@4994ec80", - "name": "@opam/ppx_tools_versioned", - "version": "opam:5.2.3", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/b1/b1455e5a4a1bcd9ddbfcf712ccbd4262#md5:b1455e5a4a1bcd9ddbfcf712ccbd4262", - "archive:https://github.com/ocaml-ppx/ppx_tools_versioned/archive/5.2.3.tar.gz#md5:b1455e5a4a1bcd9ddbfcf712ccbd4262" - ], - "opam": { - "name": "ppx_tools_versioned", - "version": "5.2.3", - "path": "esy.lock/opam/ppx_tools_versioned.5.2.3" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/ppx_tools@opam:6.0+4.08.0@5f5453f4": { - "id": "@opam/ppx_tools@opam:6.0+4.08.0@5f5453f4", - "name": "@opam/ppx_tools", - "version": "opam:6.0+4.08.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/80/801e82103fee7ce1e4a59ab670601952#md5:801e82103fee7ce1e4a59ab670601952", - "archive:https://github.com/ocaml-ppx/ppx_tools/archive/6.0+4.08.0.tar.gz#md5:801e82103fee7ce1e4a59ab670601952" - ], - "opam": { - "name": "ppx_tools", - "version": "6.0+4.08.0", - "path": "esy.lock/opam/ppx_tools.6.0+4.08.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2": { - "id": "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "name": "@opam/ppx_sexp_conv", - "version": "opam:v0.13.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/ac/acb33a38721f4a16f71add6afaa315da#md5:acb33a38721f4a16f71add6afaa315da", - "archive:https://ocaml.janestreet.com/ocaml-core/v0.13/files/ppx_sexp_conv-v0.13.0.tar.gz#md5:acb33a38721f4a16f71add6afaa315da" - ], - "opam": { - "name": "ppx_sexp_conv", - "version": "v0.13.0", - "path": "esy.lock/opam/ppx_sexp_conv.v0.13.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/ppxlib@opam:0.12.0@fcf5cabc", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/ppxlib@opam:0.12.0@fcf5cabc", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0" - ] - }, - "@opam/ppx_let@opam:v0.13.0@5703d2be": { - "id": "@opam/ppx_let@opam:v0.13.0@5703d2be", - "name": "@opam/ppx_let", - "version": "opam:v0.13.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/8b/8b5fab936fffa4b02f786ef18ab0c877#md5:8b5fab936fffa4b02f786ef18ab0c877", - "archive:https://ocaml.janestreet.com/ocaml-core/v0.13/files/ppx_let-v0.13.0.tar.gz#md5:8b5fab936fffa4b02f786ef18ab0c877" - ], - "opam": { - "name": "ppx_let", - "version": "v0.13.0", - "path": "esy.lock/opam/ppx_let.v0.13.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ppxlib@opam:0.12.0@fcf5cabc", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ppxlib@opam:0.12.0@fcf5cabc", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0" - ] - }, - "@opam/ppx_fields_conv@opam:v0.13.0@3c767913": { - "id": "@opam/ppx_fields_conv@opam:v0.13.0@3c767913", - "name": "@opam/ppx_fields_conv", - "version": "opam:v0.13.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/02/02c84db8ce53d6da9316bacae27d8d15#md5:02c84db8ce53d6da9316bacae27d8d15", - "archive:https://ocaml.janestreet.com/ocaml-core/v0.13/files/ppx_fields_conv-v0.13.0.tar.gz#md5:02c84db8ce53d6da9316bacae27d8d15" - ], - "opam": { - "name": "ppx_fields_conv", - "version": "v0.13.0", - "path": "esy.lock/opam/ppx_fields_conv.v0.13.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ppxlib@opam:0.12.0@fcf5cabc", - "@opam/fieldslib@opam:v0.13.0@e5d61627", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ppxlib@opam:0.12.0@fcf5cabc", - "@opam/fieldslib@opam:v0.13.0@e5d61627", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0" - ] - }, - "@opam/ppx_deriving_yojson@opam:3.5.1@06a1c37f": { - "id": "@opam/ppx_deriving_yojson@opam:3.5.1@06a1c37f", - "name": "@opam/ppx_deriving_yojson", - "version": "opam:3.5.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/ae/aefe9c673f2f0ee2beb9edcca5a4e332a9fe9266c81bc554b8df5cd375568994#sha256:aefe9c673f2f0ee2beb9edcca5a4e332a9fe9266c81bc554b8df5cd375568994", - "archive:https://github.com/ocaml-ppx/ppx_deriving_yojson/archive/v3.5.1.tar.gz#sha256:aefe9c673f2f0ee2beb9edcca5a4e332a9fe9266c81bc554b8df5cd375568994" - ], - "opam": { - "name": "ppx_deriving_yojson", - "version": "3.5.1", - "path": "esy.lock/opam/ppx_deriving_yojson.3.5.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/yojson@opam:1.7.0@7056d985", - "@opam/result@opam:1.5@6b753c82", - "@opam/ppxfind@opam:1.4@c51fd7bf", - "@opam/ppx_tools@opam:6.0+4.08.0@5f5453f4", - "@opam/ppx_deriving@opam:4.4.1@208c6c8f", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cppo@opam:1.6.6@f4f83858", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/yojson@opam:1.7.0@7056d985", - "@opam/result@opam:1.5@6b753c82", - "@opam/ppx_deriving@opam:4.4.1@208c6c8f", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/ppx_deriving@opam:4.4.1@208c6c8f": { - "id": "@opam/ppx_deriving@opam:4.4.1@208c6c8f", - "name": "@opam/ppx_deriving", - "version": "opam:4.4.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/27/27bc57774724fc4f48775f2011375a5ee1439570204abbf6607761c472757e2f#sha256:27bc57774724fc4f48775f2011375a5ee1439570204abbf6607761c472757e2f", - "archive:https://github.com/ocaml-ppx/ppx_deriving/archive/v4.4.1.tar.gz#sha256:27bc57774724fc4f48775f2011375a5ee1439570204abbf6607761c472757e2f" - ], - "opam": { - "name": "ppx_deriving", - "version": "4.4.1", - "path": "esy.lock/opam/ppx_deriving.4.4.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/result@opam:1.5@6b753c82", - "@opam/ppxfind@opam:1.4@c51fd7bf", - "@opam/ppx_tools@opam:6.0+4.08.0@5f5453f4", - "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cppo@opam:1.6.6@f4f83858", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/result@opam:1.5@6b753c82", - "@opam/ppx_tools@opam:6.0+4.08.0@5f5453f4", - "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/ppx_derivers@opam:1.2.1@ecf0aa45": { - "id": "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", - "name": "@opam/ppx_derivers", - "version": "opam:1.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/5d/5dc2bf130c1db3c731fe0fffc5648b41#md5:5dc2bf130c1db3c731fe0fffc5648b41", - "archive:https://github.com/ocaml-ppx/ppx_derivers/archive/1.2.1.tar.gz#md5:5dc2bf130c1db3c731fe0fffc5648b41" - ], - "opam": { - "name": "ppx_derivers", - "version": "1.2.1", - "path": "esy.lock/opam/ppx_derivers.1.2.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/ppx_cstruct@opam:5.1.1@88b3aa4e": { - "id": "@opam/ppx_cstruct@opam:5.1.1@88b3aa4e", - "name": "@opam/ppx_cstruct", - "version": "opam:5.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/55/55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3#sha256:55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3", - "archive:https://github.com/mirage/ocaml-cstruct/releases/download/v5.1.1/cstruct-v5.1.1.tbz#sha256:55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3" - ], - "opam": { - "name": "ppx_cstruct", - "version": "5.1.1", - "path": "esy.lock/opam/ppx_cstruct.5.1.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/stdlib-shims@opam:0.1.0@d957c903", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/ppx_tools_versioned@opam:5.2.3@4994ec80", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cstruct@opam:5.1.1@e0b5aafd", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/stdlib-shims@opam:0.1.0@d957c903", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/ppx_tools_versioned@opam:5.2.3@4994ec80", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cstruct@opam:5.1.1@e0b5aafd" - ] - }, - "@opam/parsexp@opam:v0.13.0@5b4df040": { - "id": "@opam/parsexp@opam:v0.13.0@5b4df040", - "name": "@opam/parsexp", - "version": "opam:v0.13.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/08/08d2f6eca6a1eda735bf030d2581da43#md5:08d2f6eca6a1eda735bf030d2581da43", - "archive:https://ocaml.janestreet.com/ocaml-core/v0.13/files/parsexp-v0.13.0.tar.gz#md5:08d2f6eca6a1eda735bf030d2581da43" - ], - "opam": { - "name": "parsexp", - "version": "v0.13.0", - "path": "esy.lock/opam/parsexp.v0.13.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0" - ] - }, - "@opam/ocplib-endian@opam:1.0@aa720242": { - "id": "@opam/ocplib-endian@opam:1.0@aa720242", - "name": "@opam/ocplib-endian", - "version": "opam:1.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/74/74b45ba33e189283170a748c2a3ed477#md5:74b45ba33e189283170a748c2a3ed477", - "archive:https://github.com/OCamlPro/ocplib-endian/archive/1.0.tar.gz#md5:74b45ba33e189283170a748c2a3ed477" - ], - "opam": { - "name": "ocplib-endian", - "version": "1.0", - "path": "esy.lock/opam/ocplib-endian.1.0" - } - }, - "overrides": [ - { - "opamoverride": "esy.lock/overrides/opam__s__ocplib_endian_opam__c__1.0_opam_override" - } - ], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@opam/cppo@opam:1.6.6@f4f83858", - "@opam/base-bytes@opam:base@19d0c2ff", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/cppo@opam:1.6.6@f4f83858", - "@opam/base-bytes@opam:base@19d0c2ff" - ] - }, - "@opam/ocb-stubblr@opam:0.1.1-1@fa95dcc0": { - "id": "@opam/ocb-stubblr@opam:0.1.1-1@fa95dcc0", - "name": "@opam/ocb-stubblr", - "version": "opam:0.1.1-1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/60/607720dd18ca51e40645b42df5c1273e#md5:607720dd18ca51e40645b42df5c1273e", - "archive:https://github.com/pqwy/ocb-stubblr/releases/download/v0.1.1/ocb-stubblr-0.1.1.tbz#md5:607720dd18ca51e40645b42df5c1273e" - ], - "opam": { - "name": "ocb-stubblr", - "version": "0.1.1-1", - "path": "esy.lock/opam/ocb-stubblr.0.1.1-1" - } - }, - "overrides": [ - { - "opamoverride": "esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override" - } - ], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@opam/astring@opam:0.8.3@4e5e17d5", - "@esy-ocaml/substs@0.0.1@d41d8cd9", - "@esy-ocaml/fauxpam@0.2.0@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@opam/astring@opam:0.8.3@4e5e17d5" - ] - }, - "@opam/ocamlfind@opam:1.8.1@ff07b0f9": { - "id": "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "name": "@opam/ocamlfind", - "version": "opam:1.8.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/18/18ca650982c15536616dea0e422cbd8c#md5:18ca650982c15536616dea0e422cbd8c", - "archive:http://download2.camlcity.org/download/findlib-1.8.1.tar.gz#md5:18ca650982c15536616dea0e422cbd8c", - "archive:http://download.camlcity.org/download/findlib-1.8.1.tar.gz#md5:18ca650982c15536616dea0e422cbd8c" - ], - "opam": { - "name": "ocamlfind", - "version": "1.8.1", - "path": "esy.lock/opam/ocamlfind.1.8.1" - } - }, - "overrides": [ - { - "opamoverride": "esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override" - } - ], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/conf-m4@opam:1@3b2b148a", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": ["ocaml@4.8.1000@d41d8cd9"] - }, - "@opam/ocamlbuild@opam:0.14.0@6ac75d03": { - "id": "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "name": "@opam/ocamlbuild", - "version": "opam:0.14.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/87/87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78#sha256:87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78", - "archive:https://github.com/ocaml/ocamlbuild/archive/0.14.0.tar.gz#sha256:87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78" - ], - "opam": { - "name": "ocamlbuild", - "version": "0.14.0", - "path": "esy.lock/opam/ocamlbuild.0.14.0" - } - }, - "overrides": [ - { - "opamoverride": "esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override" - } - ], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": ["ocaml@4.8.1000@d41d8cd9"] - }, - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7": { - "id": "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "name": "@opam/ocaml-migrate-parsetree", - "version": "opam:1.6.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/9b/9b018e7d25114ce17fc0b82b7cd7c927b84ebb6b043aa987fa7731c2484de33f#sha256:9b018e7d25114ce17fc0b82b7cd7c927b84ebb6b043aa987fa7731c2484de33f", - "archive:https://github.com/ocaml-ppx/ocaml-migrate-parsetree/releases/download/v1.6.0/ocaml-migrate-parsetree-v1.6.0.tbz#sha256:9b018e7d25114ce17fc0b82b7cd7c927b84ebb6b043aa987fa7731c2484de33f" - ], - "opam": { - "name": "ocaml-migrate-parsetree", - "version": "1.6.0", - "path": "esy.lock/opam/ocaml-migrate-parsetree.1.6.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/result@opam:1.5@6b753c82", - "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/result@opam:1.5@6b753c82", - "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/ocaml-compiler-libs@opam:v0.12.1@5c34eb0d": { - "id": "@opam/ocaml-compiler-libs@opam:v0.12.1@5c34eb0d", - "name": "@opam/ocaml-compiler-libs", - "version": "opam:v0.12.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/2f/2f929af7c764a3f681a5671f271210c4#md5:2f929af7c764a3f681a5671f271210c4", - "archive:https://github.com/janestreet/ocaml-compiler-libs/archive/v0.12.1.tar.gz#md5:2f929af7c764a3f681a5671f271210c4" - ], - "opam": { - "name": "ocaml-compiler-libs", - "version": "v0.12.1", - "path": "esy.lock/opam/ocaml-compiler-libs.v0.12.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/num@opam:1.3@43fe4f7f": { - "id": "@opam/num@opam:1.3@43fe4f7f", - "name": "@opam/num", - "version": "opam:1.3", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/f0/f074e12325e84ebc883b37e5db10403d#md5:f074e12325e84ebc883b37e5db10403d", - "archive:https://github.com/ocaml/num/archive/v1.3.tar.gz#md5:f074e12325e84ebc883b37e5db10403d" - ], - "opam": { - "name": "num", - "version": "1.3", - "path": "esy.lock/opam/num.1.3" - } - }, - "overrides": [ - { - "opamoverride": "esy.lock/overrides/opam__s__num_opam__c__1.3_opam_override" - } - ], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": ["ocaml@4.8.1000@d41d8cd9"] - }, - "@opam/nocrypto@opam:0.5.4-2@723e1f42": { - "id": "@opam/nocrypto@opam:0.5.4-2@723e1f42", - "name": "@opam/nocrypto", - "version": "opam:0.5.4-2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/c3/c331a7a4d2a563d1d5ed581aeb849011#md5:c331a7a4d2a563d1d5ed581aeb849011", - "archive:https://github.com/mirleft/ocaml-nocrypto/releases/download/v0.5.4/nocrypto-0.5.4.tbz#md5:c331a7a4d2a563d1d5ed581aeb849011" - ], - "opam": { - "name": "nocrypto", - "version": "0.5.4-2", - "path": "esy.lock/opam/nocrypto.0.5.4-2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/zarith@opam:1.9.1@ce833113", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/ppx_deriving@opam:4.4.1@208c6c8f", - "@opam/ocb-stubblr@opam:0.1.1-1@fa95dcc0", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@opam/mirage-no-xen@opam:1@0d45465b", - "@opam/mirage-no-solo5@opam:1@84049e1f", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/cstruct-lwt@opam:5.1.1@8923fbc9", - "@opam/cstruct@opam:5.1.1@e0b5aafd", - "@opam/cpuid@opam:0.1.2@469a8b76", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/zarith@opam:1.9.1@ce833113", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/ppx_deriving@opam:4.4.1@208c6c8f", - "@opam/mirage-no-xen@opam:1@0d45465b", - "@opam/mirage-no-solo5@opam:1@84049e1f", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/cstruct-lwt@opam:5.1.1@8923fbc9", - "@opam/cstruct@opam:5.1.1@e0b5aafd" - ] - }, - "@opam/mmap@opam:1.1.0@b85334ff": { - "id": "@opam/mmap@opam:1.1.0@b85334ff", - "name": "@opam/mmap", - "version": "opam:1.1.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/8c/8c5d5fbc537296dc525867535fb878ba#md5:8c5d5fbc537296dc525867535fb878ba", - "archive:https://github.com/mirage/mmap/releases/download/v1.1.0/mmap-v1.1.0.tbz#md5:8c5d5fbc537296dc525867535fb878ba" - ], - "opam": { - "name": "mmap", - "version": "1.1.0", - "path": "esy.lock/opam/mmap.1.1.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/mirage-no-xen@opam:1@0d45465b": { - "id": "@opam/mirage-no-xen@opam:1@0d45465b", - "name": "@opam/mirage-no-xen", - "version": "opam:1", - "source": { - "type": "install", - "source": ["no-source:"], - "opam": { - "name": "mirage-no-xen", - "version": "1", - "path": "esy.lock/opam/mirage-no-xen.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": ["ocaml@4.8.1000@d41d8cd9"] - }, - "@opam/mirage-no-solo5@opam:1@84049e1f": { - "id": "@opam/mirage-no-solo5@opam:1@84049e1f", - "name": "@opam/mirage-no-solo5", - "version": "opam:1", - "source": { - "type": "install", - "source": ["no-source:"], - "opam": { - "name": "mirage-no-solo5", - "version": "1", - "path": "esy.lock/opam/mirage-no-solo5.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": ["ocaml@4.8.1000@d41d8cd9"] - }, - "@opam/merlin-extend@opam:0.5@a5dd7d4b": { - "id": "@opam/merlin-extend@opam:0.5@a5dd7d4b", - "name": "@opam/merlin-extend", - "version": "opam:0.5", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/ca/ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227#sha256:ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227", - "archive:https://github.com/let-def/merlin-extend/releases/download/v0.5/merlin-extend-v0.5.tbz#sha256:ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227" - ], - "opam": { - "name": "merlin-extend", - "version": "0.5", - "path": "esy.lock/opam/merlin-extend.0.5" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cppo@opam:1.6.6@f4f83858", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/merlin@opam:3.3.3@d653b06a": { - "id": "@opam/merlin@opam:3.3.3@d653b06a", - "name": "@opam/merlin", - "version": "opam:3.3.3", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/72/72909ef47eea1f6fca13b4109a34dccf8fe3923a3c026f1ed1db9eb5ee9aae15#sha256:72909ef47eea1f6fca13b4109a34dccf8fe3923a3c026f1ed1db9eb5ee9aae15", - "archive:https://github.com/ocaml/merlin/releases/download/v3.3.3/merlin-v3.3.3.tbz#sha256:72909ef47eea1f6fca13b4109a34dccf8fe3923a3c026f1ed1db9eb5ee9aae15" - ], - "opam": { - "name": "merlin", - "version": "3.3.3", - "path": "esy.lock/opam/merlin.3.3.3" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/yojson@opam:1.7.0@7056d985", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/yojson@opam:1.7.0@7056d985", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/menhirSdk@opam:20200211@1b43927c": { - "id": "@opam/menhirSdk@opam:20200211@1b43927c", - "name": "@opam/menhirSdk", - "version": "opam:20200211", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/01/01577e5f15380c35bdaa8fd818204560#md5:01577e5f15380c35bdaa8fd818204560", - "archive:https://gitlab.inria.fr/fpottier/menhir/repository/20200211/archive.tar.gz#md5:01577e5f15380c35bdaa8fd818204560" - ], - "opam": { - "name": "menhirSdk", - "version": "20200211", - "path": "esy.lock/opam/menhirSdk.20200211" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/menhirLib@opam:20200211@99279102": { - "id": "@opam/menhirLib@opam:20200211@99279102", - "name": "@opam/menhirLib", - "version": "opam:20200211", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/01/01577e5f15380c35bdaa8fd818204560#md5:01577e5f15380c35bdaa8fd818204560", - "archive:https://gitlab.inria.fr/fpottier/menhir/repository/20200211/archive.tar.gz#md5:01577e5f15380c35bdaa8fd818204560" - ], - "opam": { - "name": "menhirLib", - "version": "20200211", - "path": "esy.lock/opam/menhirLib.20200211" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/menhir@opam:20200211@90483d81": { - "id": "@opam/menhir@opam:20200211@90483d81", - "name": "@opam/menhir", - "version": "opam:20200211", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/01/01577e5f15380c35bdaa8fd818204560#md5:01577e5f15380c35bdaa8fd818204560", - "archive:https://gitlab.inria.fr/fpottier/menhir/repository/20200211/archive.tar.gz#md5:01577e5f15380c35bdaa8fd818204560" - ], - "opam": { - "name": "menhir", - "version": "20200211", - "path": "esy.lock/opam/menhir.20200211" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/menhirSdk@opam:20200211@1b43927c", - "@opam/menhirLib@opam:20200211@99279102", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/menhirSdk@opam:20200211@1b43927c", - "@opam/menhirLib@opam:20200211@99279102", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/markup@opam:0.8.2@87975241": { - "id": "@opam/markup@opam:0.8.2@87975241", - "name": "@opam/markup", - "version": "opam:0.8.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/0f/0fe6b3a04d941ca40a5efdd082f1183d#md5:0fe6b3a04d941ca40a5efdd082f1183d", - "archive:https://github.com/aantron/markup.ml/archive/0.8.2.tar.gz#md5:0fe6b3a04d941ca40a5efdd082f1183d" - ], - "opam": { - "name": "markup", - "version": "0.8.2", - "path": "esy.lock/opam/markup.0.8.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uutf@opam:1.0.2@4440868f", - "@opam/uchar@opam:0.0.2@c8218eea", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uutf@opam:1.0.2@4440868f", - "@opam/uchar@opam:0.0.2@c8218eea", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/magic-mime@opam:1.1.2@980f82fb": { - "id": "@opam/magic-mime@opam:1.1.2@980f82fb", - "name": "@opam/magic-mime", - "version": "opam:1.1.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/0c/0c590bbc747531b56d392ee8f063d879df1e2026ba2dfa2d1bc98c9a9acb04eb#sha256:0c590bbc747531b56d392ee8f063d879df1e2026ba2dfa2d1bc98c9a9acb04eb", - "archive:https://github.com/mirage/ocaml-magic-mime/releases/download/v1.1.2/magic-mime-v1.1.2.tbz#sha256:0c590bbc747531b56d392ee8f063d879df1e2026ba2dfa2d1bc98c9a9acb04eb" - ], - "opam": { - "name": "magic-mime", - "version": "1.1.2", - "path": "esy.lock/opam/magic-mime.1.1.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/macaddr@opam:4.0.0@db328173": { - "id": "@opam/macaddr@opam:4.0.0@db328173", - "name": "@opam/macaddr", - "version": "opam:4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/6f/6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29#sha256:6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29", - "archive:https://github.com/mirage/ocaml-ipaddr/releases/download/v4.0.0/ipaddr-v4.0.0.tbz#sha256:6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29" - ], - "opam": { - "name": "macaddr", - "version": "4.0.0", - "path": "esy.lock/opam/macaddr.4.0.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/lwt_ppx@opam:2.0.0@9a61dd37": { - "id": "@opam/lwt_ppx@opam:2.0.0@9a61dd37", - "name": "@opam/lwt_ppx", - "version": "opam:2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/a4/a4ffc0e3aa692d2e7d800f4cf2dd3db0#md5:a4ffc0e3aa692d2e7d800f4cf2dd3db0", - "archive:https://github.com/ocsigen/lwt/archive/5.0.0.tar.gz#md5:a4ffc0e3aa692d2e7d800f4cf2dd3db0" - ], - "opam": { - "name": "lwt_ppx", - "version": "2.0.0", - "path": "esy.lock/opam/lwt_ppx.2.0.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ppx_tools_versioned@opam:5.2.3@4994ec80", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ppx_tools_versioned@opam:5.2.3@4994ec80", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/lwt@opam:5.1.2@5717dfd1": { - "id": "@opam/lwt@opam:5.1.2@5717dfd1", - "name": "@opam/lwt", - "version": "opam:5.1.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/dc/dc4005582a6ab32227f5ff90cb480dbe#md5:dc4005582a6ab32227f5ff90cb480dbe", - "archive:https://github.com/ocsigen/lwt/archive/5.1.2.tar.gz#md5:dc4005582a6ab32227f5ff90cb480dbe" - ], - "opam": { - "name": "lwt", - "version": "5.1.2", - "path": "esy.lock/opam/lwt.5.1.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/seq@opam:base@d8d7de1d", - "@opam/result@opam:1.5@6b753c82", - "@opam/ocplib-endian@opam:1.0@aa720242", - "@opam/mmap@opam:1.1.0@b85334ff", - "@opam/dune-configurator@opam:2.3.1@f275cf9a", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cppo@opam:1.6.6@f4f83858", - "@opam/base-unix@opam:base@87d0b2eb", - "@opam/base-threads@opam:base@36803084", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/seq@opam:base@d8d7de1d", - "@opam/result@opam:1.5@6b753c82", - "@opam/ocplib-endian@opam:1.0@aa720242", - "@opam/mmap@opam:1.1.0@b85334ff", - "@opam/dune-configurator@opam:2.3.1@f275cf9a", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/logs@opam:0.7.0@1d03143e": { - "id": "@opam/logs@opam:0.7.0@1d03143e", - "name": "@opam/logs", - "version": "opam:0.7.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/2b/2bf021ca13331775e33cf34ab60246f7#md5:2bf021ca13331775e33cf34ab60246f7", - "archive:https://erratique.ch/software/logs/releases/logs-0.7.0.tbz#md5:2bf021ca13331775e33cf34ab60246f7" - ], - "opam": { - "name": "logs", - "version": "0.7.0", - "path": "esy.lock/opam/logs.0.7.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/fmt@opam:0.8.8@01c3a23c", - "@opam/cmdliner@opam:1.0.4@93208aac", - "@opam/base-threads@opam:base@36803084", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": ["ocaml@4.8.1000@d41d8cd9"] - }, - "@opam/lambdasoup@opam:0.7.0@a04ae670": { - "id": "@opam/lambdasoup@opam:0.7.0@a04ae670", - "name": "@opam/lambdasoup", - "version": "opam:0.7.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/2b/2bb2c7d8a6ac4e12aa7dbdfcbaac0dd8#md5:2bb2c7d8a6ac4e12aa7dbdfcbaac0dd8", - "archive:https://github.com/aantron/lambdasoup/archive/0.7.0.tar.gz#md5:2bb2c7d8a6ac4e12aa7dbdfcbaac0dd8" - ], - "opam": { - "name": "lambdasoup", - "version": "0.7.0", - "path": "esy.lock/opam/lambdasoup.0.7.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/markup@opam:0.8.2@87975241", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/markup@opam:0.8.2@87975241", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/junit@opam:2.0.2@0b7bd730": { - "id": "@opam/junit@opam:2.0.2@0b7bd730", - "name": "@opam/junit", - "version": "opam:2.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/fd/fda941b653613a4a5731f9b3557364b12baa341daa13c01676c9eb8d64e96b01#sha256:fda941b653613a4a5731f9b3557364b12baa341daa13c01676c9eb8d64e96b01", - "archive:https://github.com/Khady/ocaml-junit/releases/download/2.0.2/junit-2.0.2.tbz#sha256:fda941b653613a4a5731f9b3557364b12baa341daa13c01676c9eb8d64e96b01" - ], - "opam": { - "name": "junit", - "version": "2.0.2", - "path": "esy.lock/opam/junit.2.0.2" - } - }, - "overrides": [], - "dependencies": [ - "@opam/tyxml@opam:4.3.0@c1da25f1", - "@opam/ptime@opam:0.8.5@0051d642", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "@opam/tyxml@opam:4.3.0@c1da25f1", - "@opam/ptime@opam:0.8.5@0051d642", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/jsonm@opam:1.0.1@ad3e76f5": { - "id": "@opam/jsonm@opam:1.0.1@ad3e76f5", - "name": "@opam/jsonm", - "version": "opam:1.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/e2/e2ca39eaefd55b8d155c4f1ec5885311#md5:e2ca39eaefd55b8d155c4f1ec5885311", - "archive:http://erratique.ch/software/jsonm/releases/jsonm-1.0.1.tbz#md5:e2ca39eaefd55b8d155c4f1ec5885311" - ], - "opam": { - "name": "jsonm", - "version": "1.0.1", - "path": "esy.lock/opam/jsonm.1.0.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uutf@opam:1.0.2@4440868f", - "@opam/uchar@opam:0.0.2@c8218eea", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uutf@opam:1.0.2@4440868f", - "@opam/uchar@opam:0.0.2@c8218eea" - ] - }, - "@opam/jbuilder@opam:1.0+beta20.2@053ddcf2": { - "id": "@opam/jbuilder@opam:1.0+beta20.2@053ddcf2", - "name": "@opam/jbuilder", - "version": "opam:1.0+beta20.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/fb/fbe8c3b1facb206cac3fb8932b5dd5d9#md5:fbe8c3b1facb206cac3fb8932b5dd5d9", - "archive:https://github.com/ocaml/dune/releases/download/1.0%2Bbeta20.2/jbuilder-1.0+beta20.2.tbz#md5:fbe8c3b1facb206cac3fb8932b5dd5d9" - ], - "opam": { - "name": "jbuilder", - "version": "1.0+beta20.2", - "path": "esy.lock/opam/jbuilder.1.0+beta20.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": ["ocaml@4.8.1000@d41d8cd9"] - }, - "@opam/ipaddr-sexp@opam:4.0.0@eee6f9bd": { - "id": "@opam/ipaddr-sexp@opam:4.0.0@eee6f9bd", - "name": "@opam/ipaddr-sexp", - "version": "opam:4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/6f/6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29#sha256:6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29", - "archive:https://github.com/mirage/ocaml-ipaddr/releases/download/v4.0.0/ipaddr-v4.0.0.tbz#sha256:6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29" - ], - "opam": { - "name": "ipaddr-sexp", - "version": "4.0.0", - "path": "esy.lock/opam/ipaddr-sexp.4.0.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/ipaddr@opam:4.0.0@af37ddc7", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/ipaddr@opam:4.0.0@af37ddc7", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/ipaddr@opam:4.0.0@af37ddc7": { - "id": "@opam/ipaddr@opam:4.0.0@af37ddc7", - "name": "@opam/ipaddr", - "version": "opam:4.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/6f/6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29#sha256:6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29", - "archive:https://github.com/mirage/ocaml-ipaddr/releases/download/v4.0.0/ipaddr-v4.0.0.tbz#sha256:6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29" - ], - "opam": { - "name": "ipaddr", - "version": "4.0.0", - "path": "esy.lock/opam/ipaddr.4.0.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/macaddr@opam:4.0.0@db328173", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/domain-name@opam:0.3.0@af116067", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/macaddr@opam:4.0.0@db328173", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/domain-name@opam:0.3.0@af116067" - ] - }, - "@opam/gmap@opam:0.3.0@599a6bf7": { - "id": "@opam/gmap@opam:0.3.0@599a6bf7", - "name": "@opam/gmap", - "version": "opam:0.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/04/04dd9e6226ac8f8fb4ccb6021048702e34a482fb9c1d240d3852829529507c1c#sha256:04dd9e6226ac8f8fb4ccb6021048702e34a482fb9c1d240d3852829529507c1c", - "archive:https://github.com/hannesm/gmap/releases/download/0.3.0/gmap-0.3.0.tbz#sha256:04dd9e6226ac8f8fb4ccb6021048702e34a482fb9c1d240d3852829529507c1c" - ], - "opam": { - "name": "gmap", - "version": "0.3.0", - "path": "esy.lock/opam/gmap.0.3.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/fmt@opam:0.8.8@01c3a23c": { - "id": "@opam/fmt@opam:0.8.8@01c3a23c", - "name": "@opam/fmt", - "version": "opam:0.8.8", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/47/473490fcfdf3ff0a8ccee226b873d4b2#md5:473490fcfdf3ff0a8ccee226b873d4b2", - "archive:https://erratique.ch/software/fmt/releases/fmt-0.8.8.tbz#md5:473490fcfdf3ff0a8ccee226b873d4b2" - ], - "opam": { - "name": "fmt", - "version": "0.8.8", - "path": "esy.lock/opam/fmt.0.8.8" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/stdlib-shims@opam:0.1.0@d957c903", - "@opam/seq@opam:base@d8d7de1d", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@opam/cmdliner@opam:1.0.4@93208aac", - "@opam/base-unix@opam:base@87d0b2eb", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/stdlib-shims@opam:0.1.0@d957c903", - "@opam/seq@opam:base@d8d7de1d" - ] - }, - "@opam/fieldslib@opam:v0.13.0@e5d61627": { - "id": "@opam/fieldslib@opam:v0.13.0@e5d61627", - "name": "@opam/fieldslib", - "version": "opam:v0.13.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/3a/3ac72dc49e43416c8b6fa0897bd4838b#md5:3ac72dc49e43416c8b6fa0897bd4838b", - "archive:https://ocaml.janestreet.com/ocaml-core/v0.13/files/fieldslib-v0.13.0.tar.gz#md5:3ac72dc49e43416c8b6fa0897bd4838b" - ], - "opam": { - "name": "fieldslib", - "version": "v0.13.0", - "path": "esy.lock/opam/fieldslib.v0.13.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base@opam:v0.13.1@7d937ed0" - ] - }, - "@opam/easy-format@opam:1.3.2@0484b3c4": { - "id": "@opam/easy-format@opam:1.3.2@0484b3c4", - "name": "@opam/easy-format", - "version": "opam:1.3.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/34/3440c2b882d537ae5e9011eb06abb53f5667e651ea4bb3b460ea8230fa8c1926#sha256:3440c2b882d537ae5e9011eb06abb53f5667e651ea4bb3b460ea8230fa8c1926", - "archive:https://github.com/mjambon/easy-format/releases/download/1.3.2/easy-format-1.3.2.tbz#sha256:3440c2b882d537ae5e9011eb06abb53f5667e651ea4bb3b460ea8230fa8c1926" - ], - "opam": { - "name": "easy-format", - "version": "1.3.2", - "path": "esy.lock/opam/easy-format.1.3.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/dune-private-libs@opam:2.3.1@6390fc3e": { - "id": "@opam/dune-private-libs@opam:2.3.1@6390fc3e", - "name": "@opam/dune-private-libs", - "version": "opam:2.3.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/b2/b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb#sha256:b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb", - "archive:https://github.com/ocaml/dune/releases/download/2.3.1/dune-2.3.1.tbz#sha256:b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb" - ], - "opam": { - "name": "dune-private-libs", - "version": "2.3.1", - "path": "esy.lock/opam/dune-private-libs.2.3.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/dune-configurator@opam:2.3.1@f275cf9a": { - "id": "@opam/dune-configurator@opam:2.3.1@f275cf9a", - "name": "@opam/dune-configurator", - "version": "opam:2.3.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/b2/b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb#sha256:b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb", - "archive:https://github.com/ocaml/dune/releases/download/2.3.1/dune-2.3.1.tbz#sha256:b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb" - ], - "opam": { - "name": "dune-configurator", - "version": "2.3.1", - "path": "esy.lock/opam/dune-configurator.2.3.1" - } - }, - "overrides": [], - "dependencies": [ - "@opam/dune-private-libs@opam:2.3.1@6390fc3e", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "@opam/dune-private-libs@opam:2.3.1@6390fc3e", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/dune@opam:2.3.1@b10b59bf": { - "id": "@opam/dune@opam:2.3.1@b10b59bf", - "name": "@opam/dune", - "version": "opam:2.3.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/b2/b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb#sha256:b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb", - "archive:https://github.com/ocaml/dune/releases/download/2.3.1/dune-2.3.1.tbz#sha256:b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb" - ], - "opam": { - "name": "dune", - "version": "2.3.1", - "path": "esy.lock/opam/dune.2.3.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/base-unix@opam:base@87d0b2eb", - "@opam/base-threads@opam:base@36803084", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/base-unix@opam:base@87d0b2eb", - "@opam/base-threads@opam:base@36803084" - ] - }, - "@opam/domain-name@opam:0.3.0@af116067": { - "id": "@opam/domain-name@opam:0.3.0@af116067", - "name": "@opam/domain-name", - "version": "opam:0.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/4d/4dd9ed1bc619886d1adcaff14edfb503dedb77fc0b7a28d88d213aa1c44d6c8a#sha256:4dd9ed1bc619886d1adcaff14edfb503dedb77fc0b7a28d88d213aa1c44d6c8a", - "archive:https://github.com/hannesm/domain-name/releases/download/v0.3.0/domain-name-v0.3.0.tbz#sha256:4dd9ed1bc619886d1adcaff14edfb503dedb77fc0b7a28d88d213aa1c44d6c8a" - ], - "opam": { - "name": "domain-name", - "version": "0.3.0", - "path": "esy.lock/opam/domain-name.0.3.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/fmt@opam:0.8.8@01c3a23c", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/astring@opam:0.8.3@4e5e17d5", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/fmt@opam:0.8.8@01c3a23c", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/astring@opam:0.8.3@4e5e17d5" - ] - }, - "@opam/cstruct-sexp@opam:5.1.1@58ce0491": { - "id": "@opam/cstruct-sexp@opam:5.1.1@58ce0491", - "name": "@opam/cstruct-sexp", - "version": "opam:5.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/55/55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3#sha256:55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3", - "archive:https://github.com/mirage/ocaml-cstruct/releases/download/v5.1.1/cstruct-v5.1.1.tbz#sha256:55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3" - ], - "opam": { - "name": "cstruct-sexp", - "version": "5.1.1", - "path": "esy.lock/opam/cstruct-sexp.5.1.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cstruct@opam:5.1.1@e0b5aafd", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cstruct@opam:5.1.1@e0b5aafd" - ] - }, - "@opam/cstruct-lwt@opam:5.1.1@8923fbc9": { - "id": "@opam/cstruct-lwt@opam:5.1.1@8923fbc9", - "name": "@opam/cstruct-lwt", - "version": "opam:5.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/55/55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3#sha256:55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3", - "archive:https://github.com/mirage/ocaml-cstruct/releases/download/v5.1.1/cstruct-v5.1.1.tbz#sha256:55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3" - ], - "opam": { - "name": "cstruct-lwt", - "version": "5.1.1", - "path": "esy.lock/opam/cstruct-lwt.5.1.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cstruct@opam:5.1.1@e0b5aafd", - "@opam/base-unix@opam:base@87d0b2eb", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cstruct@opam:5.1.1@e0b5aafd", - "@opam/base-unix@opam:base@87d0b2eb" - ] - }, - "@opam/cstruct@opam:5.1.1@e0b5aafd": { - "id": "@opam/cstruct@opam:5.1.1@e0b5aafd", - "name": "@opam/cstruct", - "version": "opam:5.1.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/55/55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3#sha256:55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3", - "archive:https://github.com/mirage/ocaml-cstruct/releases/download/v5.1.1/cstruct-v5.1.1.tbz#sha256:55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3" - ], - "opam": { - "name": "cstruct", - "version": "5.1.1", - "path": "esy.lock/opam/cstruct.5.1.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/bigarray-compat@opam:1.0.0@1faefa97", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/bigarray-compat@opam:1.0.0@1faefa97" - ] - }, - "@opam/cpuid@opam:0.1.2@469a8b76": { - "id": "@opam/cpuid@opam:0.1.2@469a8b76", - "name": "@opam/cpuid", - "version": "opam:0.1.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/21/21079a17bcf6cfe92e2f706b9d0d6d8d#md5:21079a17bcf6cfe92e2f706b9d0d6d8d", - "archive:https://github.com/pqwy/cpuid/releases/download/v0.1.2/cpuid-v0.1.2.tbz#md5:21079a17bcf6cfe92e2f706b9d0d6d8d" - ], - "opam": { - "name": "cpuid", - "version": "0.1.2", - "path": "esy.lock/opam/cpuid.0.1.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/cppo@opam:1.6.6@f4f83858": { - "id": "@opam/cppo@opam:1.6.6@f4f83858", - "name": "@opam/cppo", - "version": "opam:1.6.6", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/e7/e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0#sha256:e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0", - "archive:https://github.com/ocaml-community/cppo/releases/download/v1.6.6/cppo-v1.6.6.tbz#sha256:e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0" - ], - "opam": { - "name": "cppo", - "version": "1.6.6", - "path": "esy.lock/opam/cppo.1.6.6" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base-unix@opam:base@87d0b2eb", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base-unix@opam:base@87d0b2eb" - ] - }, - "@opam/conf-perl@opam:1@a6896ba6": { - "id": "@opam/conf-perl@opam:1@a6896ba6", - "name": "@opam/conf-perl", - "version": "opam:1", - "source": { - "type": "install", - "source": ["no-source:"], - "opam": { - "name": "conf-perl", - "version": "1", - "path": "esy.lock/opam/conf-perl.1" - } - }, - "overrides": [], - "dependencies": ["@esy-ocaml/substs@0.0.1@d41d8cd9"], - "devDependencies": [] - }, - "@opam/conf-m4@opam:1@3b2b148a": { - "id": "@opam/conf-m4@opam:1@3b2b148a", - "name": "@opam/conf-m4", - "version": "opam:1", - "source": { - "type": "install", - "source": ["no-source:"], - "opam": { - "name": "conf-m4", - "version": "1", - "path": "esy.lock/opam/conf-m4.1" - } - }, - "overrides": [], - "dependencies": ["@esy-ocaml/substs@0.0.1@d41d8cd9"], - "devDependencies": [] - }, - "@opam/conf-gmp@archive:https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz#sha1:9dc6981197a7d92f339192eea974f5eca48fcffe@7e96a8d6": { - "id": "@opam/conf-gmp@archive:https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz#sha1:9dc6981197a7d92f339192eea974f5eca48fcffe@7e96a8d6", - "name": "@opam/conf-gmp", - "version": "archive:https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz#sha1:9dc6981197a7d92f339192eea974f5eca48fcffe", - "source": { - "type": "install", - "source": [ - "archive:https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz#sha1:9dc6981197a7d92f339192eea974f5eca48fcffe" - ] - }, - "overrides": ["esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b"], - "dependencies": [], - "devDependencies": [] - }, - "@opam/conduit-lwt-unix@opam:2.0.2@4f617c75": { - "id": "@opam/conduit-lwt-unix@opam:2.0.2@4f617c75", - "name": "@opam/conduit-lwt-unix", - "version": "opam:2.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/25/2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2#sha256:2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2", - "archive:https://github.com/mirage/ocaml-conduit/releases/download/v2.0.2/conduit-v2.0.2.tbz#sha256:2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2" - ], - "opam": { - "name": "conduit-lwt-unix", - "version": "2.0.2", - "path": "esy.lock/opam/conduit-lwt-unix.2.0.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uri@opam:3.1.0@d38ac0ae", - "@opam/tls@opam:0.10.5@1fd9a963", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/ipaddr-sexp@opam:4.0.0@eee6f9bd", - "@opam/ipaddr@opam:4.0.0@af37ddc7", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/conduit-lwt@opam:2.0.2@c4809b9f", - "@opam/base-unix@opam:base@87d0b2eb", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uri@opam:3.1.0@d38ac0ae", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/ipaddr-sexp@opam:4.0.0@eee6f9bd", - "@opam/ipaddr@opam:4.0.0@af37ddc7", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/conduit-lwt@opam:2.0.2@c4809b9f", - "@opam/base-unix@opam:base@87d0b2eb" - ] - }, - "@opam/conduit-lwt@opam:2.0.2@c4809b9f": { - "id": "@opam/conduit-lwt@opam:2.0.2@c4809b9f", - "name": "@opam/conduit-lwt", - "version": "opam:2.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/25/2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2#sha256:2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2", - "archive:https://github.com/mirage/ocaml-conduit/releases/download/v2.0.2/conduit-v2.0.2.tbz#sha256:2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2" - ], - "opam": { - "name": "conduit-lwt", - "version": "2.0.2", - "path": "esy.lock/opam/conduit-lwt.2.0.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/conduit@opam:2.0.2@2891d9d4", - "@opam/base-unix@opam:base@87d0b2eb", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/conduit@opam:2.0.2@2891d9d4", - "@opam/base-unix@opam:base@87d0b2eb" - ] - }, - "@opam/conduit@opam:2.0.2@2891d9d4": { - "id": "@opam/conduit@opam:2.0.2@2891d9d4", - "name": "@opam/conduit", - "version": "opam:2.0.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/25/2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2#sha256:2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2", - "archive:https://github.com/mirage/ocaml-conduit/releases/download/v2.0.2/conduit-v2.0.2.tbz#sha256:2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2" - ], - "opam": { - "name": "conduit", - "version": "2.0.2", - "path": "esy.lock/opam/conduit.2.0.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uri@opam:3.1.0@d38ac0ae", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/logs@opam:0.7.0@1d03143e", - "@opam/ipaddr-sexp@opam:4.0.0@eee6f9bd", - "@opam/ipaddr@opam:4.0.0@af37ddc7", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/astring@opam:0.8.3@4e5e17d5", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uri@opam:3.1.0@d38ac0ae", - "@opam/sexplib@opam:v0.13.0@79086695", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/logs@opam:0.7.0@1d03143e", - "@opam/ipaddr-sexp@opam:4.0.0@eee6f9bd", - "@opam/ipaddr@opam:4.0.0@af37ddc7", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/astring@opam:0.8.3@4e5e17d5" - ] - }, - "@opam/cohttp-lwt-unix@opam:2.5.1@6d59fe96": { - "id": "@opam/cohttp-lwt-unix@opam:2.5.1@6d59fe96", - "name": "@opam/cohttp-lwt-unix", - "version": "opam:2.5.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/26/268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946#sha256:268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946", - "archive:https://github.com/mirage/ocaml-cohttp/releases/download/v2.5.1/cohttp-v2.5.1.tbz#sha256:268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946" - ], - "opam": { - "name": "cohttp-lwt-unix", - "version": "2.5.1", - "path": "esy.lock/opam/cohttp-lwt-unix.2.5.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/magic-mime@opam:1.1.2@980f82fb", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/logs@opam:0.7.0@1d03143e", - "@opam/fmt@opam:0.8.8@01c3a23c", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/conduit-lwt-unix@opam:2.0.2@4f617c75", - "@opam/cohttp-lwt@opam:2.5.1@addba697", - "@opam/cmdliner@opam:1.0.4@93208aac", - "@opam/base-unix@opam:base@87d0b2eb", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/magic-mime@opam:1.1.2@980f82fb", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/logs@opam:0.7.0@1d03143e", - "@opam/fmt@opam:0.8.8@01c3a23c", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/conduit-lwt-unix@opam:2.0.2@4f617c75", - "@opam/cohttp-lwt@opam:2.5.1@addba697", - "@opam/cmdliner@opam:1.0.4@93208aac", - "@opam/base-unix@opam:base@87d0b2eb" - ] - }, - "@opam/cohttp-lwt@opam:2.5.1@addba697": { - "id": "@opam/cohttp-lwt@opam:2.5.1@addba697", - "name": "@opam/cohttp-lwt", - "version": "opam:2.5.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/26/268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946#sha256:268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946", - "archive:https://github.com/mirage/ocaml-cohttp/releases/download/v2.5.1/cohttp-v2.5.1.tbz#sha256:268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946" - ], - "opam": { - "name": "cohttp-lwt", - "version": "2.5.1", - "path": "esy.lock/opam/cohttp-lwt.2.5.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/logs@opam:0.7.0@1d03143e", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cohttp@opam:2.5.1@6494d505", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/lwt@opam:5.1.2@5717dfd1", - "@opam/logs@opam:0.7.0@1d03143e", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cohttp@opam:2.5.1@6494d505" - ] - }, - "@opam/cohttp@opam:2.5.1@6494d505": { - "id": "@opam/cohttp@opam:2.5.1@6494d505", - "name": "@opam/cohttp", - "version": "opam:2.5.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/26/268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946#sha256:268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946", - "archive:https://github.com/mirage/ocaml-cohttp/releases/download/v2.5.1/cohttp-v2.5.1.tbz#sha256:268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946" - ], - "opam": { - "name": "cohttp", - "version": "2.5.1", - "path": "esy.lock/opam/cohttp.2.5.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uri-sexp@opam:3.1.0@f97bddff", - "@opam/uri@opam:3.1.0@d38ac0ae", - "@opam/stringext@opam:1.6.0@104bc94b", - "@opam/stdlib-shims@opam:0.1.0@d957c903", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/ppx_fields_conv@opam:v0.13.0@3c767913", - "@opam/jsonm@opam:1.0.1@ad3e76f5", - "@opam/fieldslib@opam:v0.13.0@e5d61627", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base64@opam:3.3.0@d900b2d8", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/uri-sexp@opam:3.1.0@f97bddff", - "@opam/uri@opam:3.1.0@d38ac0ae", - "@opam/stringext@opam:1.6.0@104bc94b", - "@opam/stdlib-shims@opam:0.1.0@d957c903", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/re@opam:1.9.0@d4d5e13d", - "@opam/ppx_sexp_conv@opam:v0.13.0@53058ed2", - "@opam/ppx_fields_conv@opam:v0.13.0@3c767913", - "@opam/fieldslib@opam:v0.13.0@e5d61627", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base64@opam:3.3.0@d900b2d8" - ] - }, - "@opam/cmdliner@opam:1.0.4@93208aac": { - "id": "@opam/cmdliner@opam:1.0.4@93208aac", - "name": "@opam/cmdliner", - "version": "opam:1.0.4", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/fe/fe2213d0bc63b1e10a2d0aa66d2fc8d9#md5:fe2213d0bc63b1e10a2d0aa66d2fc8d9", - "archive:http://erratique.ch/software/cmdliner/releases/cmdliner-1.0.4.tbz#md5:fe2213d0bc63b1e10a2d0aa66d2fc8d9" - ], - "opam": { - "name": "cmdliner", - "version": "1.0.4", - "path": "esy.lock/opam/cmdliner.1.0.4" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": ["ocaml@4.8.1000@d41d8cd9"] - }, - "@opam/biniou@opam:1.2.1@d7570399": { - "id": "@opam/biniou@opam:1.2.1@d7570399", - "name": "@opam/biniou", - "version": "opam:1.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/35/35546c68b1929a8e6d27a3b39ecd17b38303a0d47e65eb9d1480c2061ea84335#sha256:35546c68b1929a8e6d27a3b39ecd17b38303a0d47e65eb9d1480c2061ea84335", - "archive:https://github.com/mjambon/biniou/releases/download/1.2.1/biniou-1.2.1.tbz#sha256:35546c68b1929a8e6d27a3b39ecd17b38303a0d47e65eb9d1480c2061ea84335" - ], - "opam": { - "name": "biniou", - "version": "1.2.1", - "path": "esy.lock/opam/biniou.1.2.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/easy-format@opam:1.3.2@0484b3c4", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/easy-format@opam:1.3.2@0484b3c4", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/bigarray-compat@opam:1.0.0@1faefa97": { - "id": "@opam/bigarray-compat@opam:1.0.0@1faefa97", - "name": "@opam/bigarray-compat", - "version": "opam:1.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/1c/1cc7c25382a8900bada34aadfd66632e#md5:1cc7c25382a8900bada34aadfd66632e", - "archive:https://github.com/mirage/bigarray-compat/archive/v1.0.0.tar.gz#md5:1cc7c25382a8900bada34aadfd66632e" - ], - "opam": { - "name": "bigarray-compat", - "version": "1.0.0", - "path": "esy.lock/opam/bigarray-compat.1.0.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/base64@opam:3.3.0@d900b2d8": { - "id": "@opam/base64@opam:3.3.0@d900b2d8", - "name": "@opam/base64", - "version": "opam:3.3.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/3a/3ae91334f029ccd96690b598010f94e55811095d14a37d52f1724e5eca0f35cc#sha256:3ae91334f029ccd96690b598010f94e55811095d14a37d52f1724e5eca0f35cc", - "archive:https://github.com/mirage/ocaml-base64/releases/download/v3.3.0/base64-v3.3.0.tbz#sha256:3ae91334f029ccd96690b598010f94e55811095d14a37d52f1724e5eca0f35cc" - ], - "opam": { - "name": "base64", - "version": "3.3.0", - "path": "esy.lock/opam/base64.3.3.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune-configurator@opam:2.3.1@f275cf9a", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base-bytes@opam:base@19d0c2ff", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune-configurator@opam:2.3.1@f275cf9a", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/base-bytes@opam:base@19d0c2ff" - ] - }, - "@opam/base-unix@opam:base@87d0b2eb": { - "id": "@opam/base-unix@opam:base@87d0b2eb", - "name": "@opam/base-unix", - "version": "opam:base", - "source": { - "type": "install", - "source": ["no-source:"], - "opam": { - "name": "base-unix", - "version": "base", - "path": "esy.lock/opam/base-unix.base" - } - }, - "overrides": [], - "dependencies": ["@esy-ocaml/substs@0.0.1@d41d8cd9"], - "devDependencies": [] - }, - "@opam/base-threads@opam:base@36803084": { - "id": "@opam/base-threads@opam:base@36803084", - "name": "@opam/base-threads", - "version": "opam:base", - "source": { - "type": "install", - "source": ["no-source:"], - "opam": { - "name": "base-threads", - "version": "base", - "path": "esy.lock/opam/base-threads.base" - } - }, - "overrides": [], - "dependencies": ["@esy-ocaml/substs@0.0.1@d41d8cd9"], - "devDependencies": [] - }, - "@opam/base-bytes@opam:base@19d0c2ff": { - "id": "@opam/base-bytes@opam:base@19d0c2ff", - "name": "@opam/base-bytes", - "version": "opam:base", - "source": { - "type": "install", - "source": ["no-source:"], - "opam": { - "name": "base-bytes", - "version": "base", - "path": "esy.lock/opam/base-bytes.base" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9" - ] - }, - "@opam/base@opam:v0.13.1@7d937ed0": { - "id": "@opam/base@opam:v0.13.1@7d937ed0", - "name": "@opam/base", - "version": "opam:v0.13.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/29/296457416f9a8b75e6edfc3b1140e384#md5:296457416f9a8b75e6edfc3b1140e384", - "archive:https://github.com/janestreet/base/archive/v0.13.1.tar.gz#md5:296457416f9a8b75e6edfc3b1140e384" - ], - "opam": { - "name": "base", - "version": "v0.13.1", - "path": "esy.lock/opam/base.v0.13.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/dune-configurator@opam:2.3.1@f275cf9a", - "@opam/dune@opam:2.3.1@b10b59bf", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/sexplib0@opam:v0.13.0@3f54c2be", - "@opam/dune-configurator@opam:2.3.1@f275cf9a", - "@opam/dune@opam:2.3.1@b10b59bf" - ] - }, - "@opam/atdgen-runtime@opam:2.0.0@60f6faab": { - "id": "@opam/atdgen-runtime@opam:2.0.0@60f6faab", - "name": "@opam/atdgen-runtime", - "version": "opam:2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/14/14e47609397c524ea0eae7c3f14f7ccf#md5:14e47609397c524ea0eae7c3f14f7ccf", - "archive:https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz#md5:14e47609397c524ea0eae7c3f14f7ccf" - ], - "opam": { - "name": "atdgen-runtime", - "version": "2.0.0", - "path": "esy.lock/opam/atdgen-runtime.2.0.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/yojson@opam:1.7.0@7056d985", - "@opam/jbuilder@opam:1.0+beta20.2@053ddcf2", - "@opam/biniou@opam:1.2.1@d7570399", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/yojson@opam:1.7.0@7056d985", - "@opam/jbuilder@opam:1.0+beta20.2@053ddcf2", - "@opam/biniou@opam:1.2.1@d7570399" - ] - }, - "@opam/atdgen@opam:2.0.0@46af0360": { - "id": "@opam/atdgen@opam:2.0.0@46af0360", - "name": "@opam/atdgen", - "version": "opam:2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/14/14e47609397c524ea0eae7c3f14f7ccf#md5:14e47609397c524ea0eae7c3f14f7ccf", - "archive:https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz#md5:14e47609397c524ea0eae7c3f14f7ccf" - ], - "opam": { - "name": "atdgen", - "version": "2.0.0", - "path": "esy.lock/opam/atdgen.2.0.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/yojson@opam:1.7.0@7056d985", - "@opam/jbuilder@opam:1.0+beta20.2@053ddcf2", - "@opam/biniou@opam:1.2.1@d7570399", - "@opam/atdgen-runtime@opam:2.0.0@60f6faab", - "@opam/atd@opam:2.0.0@e0ddd12f", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/yojson@opam:1.7.0@7056d985", - "@opam/jbuilder@opam:1.0+beta20.2@053ddcf2", - "@opam/biniou@opam:1.2.1@d7570399", - "@opam/atdgen-runtime@opam:2.0.0@60f6faab", - "@opam/atd@opam:2.0.0@e0ddd12f" - ] - }, - "@opam/atd@opam:2.0.0@e0ddd12f": { - "id": "@opam/atd@opam:2.0.0@e0ddd12f", - "name": "@opam/atd", - "version": "opam:2.0.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/14/14e47609397c524ea0eae7c3f14f7ccf#md5:14e47609397c524ea0eae7c3f14f7ccf", - "archive:https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz#md5:14e47609397c524ea0eae7c3f14f7ccf" - ], - "opam": { - "name": "atd", - "version": "2.0.0", - "path": "esy.lock/opam/atd.2.0.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/menhir@opam:20200211@90483d81", - "@opam/jbuilder@opam:1.0+beta20.2@053ddcf2", - "@opam/easy-format@opam:1.3.2@0484b3c4", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/jbuilder@opam:1.0+beta20.2@053ddcf2", - "@opam/easy-format@opam:1.3.2@0484b3c4" - ] - }, - "@opam/astring@opam:0.8.3@4e5e17d5": { - "id": "@opam/astring@opam:0.8.3@4e5e17d5", - "name": "@opam/astring", - "version": "opam:0.8.3", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/c5/c5bf6352b9ac27fbeab342740f4fa870#md5:c5bf6352b9ac27fbeab342740f4fa870", - "archive:http://erratique.ch/software/astring/releases/astring-0.8.3.tbz#md5:c5bf6352b9ac27fbeab342740f4fa870" - ], - "opam": { - "name": "astring", - "version": "0.8.3", - "path": "esy.lock/opam/astring.0.8.3" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/topkg@opam:1.0.1@a42c631e", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@opam/base-bytes@opam:base@19d0c2ff", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/base-bytes@opam:base@19d0c2ff" - ] - }, - "@opam/asn1-combinators@opam:0.2.2@61f661eb": { - "id": "@opam/asn1-combinators@opam:0.2.2@61f661eb", - "name": "@opam/asn1-combinators", - "version": "opam:0.2.2", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/c9/c9ebd5f9def090003918081cac680224eaefbf3def8aed8fe532b711a71d3631#sha256:c9ebd5f9def090003918081cac680224eaefbf3def8aed8fe532b711a71d3631", - "archive:https://github.com/mirleft/ocaml-asn1-combinators/releases/download/v0.2.2/asn1-combinators-v0.2.2.tbz#sha256:c9ebd5f9def090003918081cac680224eaefbf3def8aed8fe532b711a71d3631" - ], - "opam": { - "name": "asn1-combinators", - "version": "0.2.2", - "path": "esy.lock/opam/asn1-combinators.0.2.2" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/zarith@opam:1.9.1@ce833113", - "@opam/stdlib-shims@opam:0.1.0@d957c903", - "@opam/ptime@opam:0.8.5@0051d642", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cstruct@opam:5.1.1@e0b5aafd", - "@opam/bigarray-compat@opam:1.0.0@1faefa97", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/zarith@opam:1.9.1@ce833113", - "@opam/stdlib-shims@opam:0.1.0@d957c903", - "@opam/ptime@opam:0.8.5@0051d642", - "@opam/dune@opam:2.3.1@b10b59bf", - "@opam/cstruct@opam:5.1.1@e0b5aafd", - "@opam/bigarray-compat@opam:1.0.0@1faefa97" - ] - }, - "@jest/types@24.9.0@d41d8cd9": { - "id": "@jest/types@24.9.0@d41d8cd9", - "name": "@jest/types", - "version": "24.9.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz#sha1:63cb26cb7500d069e5a389441a7c6ab5e909fc59" - ] - }, - "overrides": [], - "dependencies": [ - "@types/yargs@13.0.8@d41d8cd9", - "@types/istanbul-reports@1.1.1@d41d8cd9", - "@types/istanbul-lib-coverage@2.0.1@d41d8cd9" - ], - "devDependencies": [] - }, - "@esy-ocaml/substs@0.0.1@d41d8cd9": { - "id": "@esy-ocaml/substs@0.0.1@d41d8cd9", - "name": "@esy-ocaml/substs", - "version": "0.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@esy-ocaml/substs/-/substs-0.0.1.tgz#sha1:59ebdbbaedcda123fc7ed8fb2b302b7d819e9a46" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "@esy-ocaml/reason@3.5.2@d41d8cd9": { - "id": "@esy-ocaml/reason@3.5.2@d41d8cd9", - "name": "@esy-ocaml/reason", - "version": "3.5.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@esy-ocaml/reason/-/reason-3.5.2.tgz#sha1:ac48b63fd66fbbc1d77ab6a2b7e3a1ba21a8f40b" - ] - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/result@opam:1.5@6b753c82", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocaml-migrate-parsetree@opam:1.6.0@da2643e7", - "@opam/merlin-extend@opam:0.5@a5dd7d4b", - "@opam/menhir@opam:20200211@90483d81", - "@opam/dune@opam:2.3.1@b10b59bf" - ], - "devDependencies": [] - }, - "@esy-ocaml/fauxpam@0.2.0@d41d8cd9": { - "id": "@esy-ocaml/fauxpam@0.2.0@d41d8cd9", - "name": "@esy-ocaml/fauxpam", - "version": "0.2.0", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@esy-ocaml/fauxpam/-/fauxpam-0.2.0.tgz#sha1:2d68dd7387f43dd2be6c5c0035f71c4dadf08f46" - ] - }, - "overrides": [], - "dependencies": [ - "ocaml@4.8.1000@d41d8cd9", - "@opam/dune@opam:2.3.1@b10b59bf" - ], - "devDependencies": [] - }, - "@babel/runtime@7.8.4@d41d8cd9": { - "id": "@babel/runtime@7.8.4@d41d8cd9", - "name": "@babel/runtime", - "version": "7.8.4", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz#sha1:d79f5a2040f7caa24d53e563aad49cbc05581308" - ] - }, - "overrides": [], - "dependencies": ["regenerator-runtime@0.13.4@d41d8cd9"], - "devDependencies": [] - }, - "@babel/highlight@7.8.3@d41d8cd9": { - "id": "@babel/highlight@7.8.3@d41d8cd9", - "name": "@babel/highlight", - "version": "7.8.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz#sha1:28f173d04223eaaa59bc1d439a3836e6d1265797" - ] - }, - "overrides": [], - "dependencies": [ - "js-tokens@4.0.0@d41d8cd9", - "esutils@2.0.3@d41d8cd9", - "chalk@2.4.2@d41d8cd9" - ], - "devDependencies": [] - }, - "@babel/code-frame@7.8.3@d41d8cd9": { - "id": "@babel/code-frame@7.8.3@d41d8cd9", - "name": "@babel/code-frame", - "version": "7.8.3", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz#sha1:33e25903d7481181534e12ec0a25f16b6fcf419e" - ] - }, - "overrides": [], - "dependencies": ["@babel/highlight@7.8.3@d41d8cd9"], - "devDependencies": [] - } - } -} diff --git a/esy.lock/opam/asn1-combinators.0.2.2/opam b/esy.lock/opam/asn1-combinators.0.2.2/opam deleted file mode 100644 index 1681676..0000000 --- a/esy.lock/opam/asn1-combinators.0.2.2/opam +++ /dev/null @@ -1,38 +0,0 @@ -opam-version: "2.0" -authors: "David Kaloper Meršinjak" -maintainer: "David Kaloper Meršinjak " -homepage: "https://github.com/mirleft/ocaml-asn1-combinators" -doc: "https://mirleft.github.io/ocaml-asn1-combinators/doc" -license: "ISC" -dev-repo: "git+https://github.com/mirleft/ocaml-asn1-combinators.git" -bug-reports: "https://github.com/mirleft/ocaml-asn1-combinators/issues" -synopsis: "Embed typed ASN.1 grammars in OCaml" -build: [ ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs ] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} ] -depends: [ - "ocaml" {>="4.05.0"} - "dune" {>= "1.2.0"} - "cstruct" {>= "1.6.0"} - "zarith" - "bigarray-compat" - "stdlib-shims" - "ptime" - "alcotest" {with-test} -] -description: """ -asn1-combinators is a library for expressing ASN.1 in OCaml. Skip the notation -part of ASN.1, and embed the abstract syntax directly in the language. These -abstract syntax representations can be used for parsing, serialization, or -random testing. - -The only ASN.1 encodings currently supported are BER and DER. -""" -url { - src: - "https://github.com/mirleft/ocaml-asn1-combinators/releases/download/v0.2.2/asn1-combinators-v0.2.2.tbz" - checksum: [ - "sha256=c9ebd5f9def090003918081cac680224eaefbf3def8aed8fe532b711a71d3631" - "sha512=199dda83814d7782183d67f9cdd6f5e8f036cbc1bcddec7ffd4adfd415ae024d1f7c720835eb173ab5e7455ed89acb99f88d0a30402c3edbfe6ca8a7182b217b" - ] -} diff --git a/esy.lock/opam/astring.0.8.3/opam b/esy.lock/opam/astring.0.8.3/opam deleted file mode 100644 index 578ba1f..0000000 --- a/esy.lock/opam/astring.0.8.3/opam +++ /dev/null @@ -1,38 +0,0 @@ -opam-version: "2.0" -maintainer: "Daniel Bünzli " -authors: ["Daniel Bünzli "] -homepage: "http://erratique.ch/software/astring" -doc: "http://erratique.ch/software/astring/doc" -dev-repo: "git+http://erratique.ch/repos/astring.git" -bug-reports: "https://github.com/dbuenzli/astring/issues" -tags: [ "string" "org:erratique" ] -license: "ISC" -depends: [ - "ocaml" {>= "4.01.0"} - "ocamlfind" {build} - "ocamlbuild" {build} - "topkg" {build} - "base-bytes" -] -build: [[ - "ocaml" "pkg/pkg.ml" "build" - "--pinned" "%{pinned}%" ]] -synopsis: "Alternative String module for OCaml" -description: """ -Astring exposes an alternative `String` module for OCaml. This module -tries to balance minimality and expressiveness for basic, index-free, -string processing and provides types and functions for substrings, -string sets and string maps. - -Remaining compatible with the OCaml `String` module is a non-goal. The -`String` module exposed by Astring has exception safe functions, -removes deprecated and rarely used functions, alters some signatures -and names, adds a few missing functions and fully exploits OCaml's -newfound string immutability. - -Astring depends only on the OCaml standard library. It is distributed -under the ISC license.""" -url { - src: "http://erratique.ch/software/astring/releases/astring-0.8.3.tbz" - checksum: "md5=c5bf6352b9ac27fbeab342740f4fa870" -} diff --git a/esy.lock/opam/atd.2.0.0/opam b/esy.lock/opam/atd.2.0.0/opam deleted file mode 100644 index 2808354..0000000 --- a/esy.lock/opam/atd.2.0.0/opam +++ /dev/null @@ -1,34 +0,0 @@ -opam-version: "2.0" -maintainer: "martin@mjambon.com" -authors: ["Martin Jambon"] - -homepage: "https://github.com/mjambon/atd" -bug-reports: "https://github.com/mjambon/atd/issues" -dev-repo: "git://github.com/mjambon/atd.git" - -build: [ - ["jbuilder" "subst" "-p" name] {pinned} - ["jbuilder" "build" "-p" name "-j" jobs] -] - -# Restore when https://github.com/mjambon/atd/issues/121 is resolved. -# build-test: [ -# ["jbuilder" "runtest" "-p" name] -# ] - -depends: [ - "ocaml" {>= "4.03.0"} - "jbuilder" - "menhir" {build} - "easy-format" -] -synopsis: "Parser for the ATD data format description language" -description: """ -ATD is the OCaml library providing a parser for the ATD language and -various utilities. ATD stands for Adjustable Type Definitions in -reference to its main property of supporting annotations that allow a -good fit with a variety of data formats.""" -url { - src: "https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz" - checksum: "md5=14e47609397c524ea0eae7c3f14f7ccf" -} diff --git a/esy.lock/opam/atdgen-runtime.2.0.0/opam b/esy.lock/opam/atdgen-runtime.2.0.0/opam deleted file mode 100644 index 7236d93..0000000 --- a/esy.lock/opam/atdgen-runtime.2.0.0/opam +++ /dev/null @@ -1,29 +0,0 @@ -opam-version: "2.0" -maintainer: "martin@mjambon.com" -authors: ["Martin Jambon"] - -homepage: "https://github.com/mjambon/atd" -bug-reports: "https://github.com/mjambon/atd/issues" -dev-repo: "git://github.com/mjambon/atd.git" - -build: [ - ["jbuilder" "subst" "-p" name] {pinned} - ["jbuilder" "build" "-p" name "-j" jobs] -] - -# Restore when https://github.com/mjambon/atd/issues/121 is resolved. -# build-test: [ -# ["jbuilder" "runtest" "-p" name] -# ] - -depends: [ - "ocaml" {>= "4.02.3"} - "jbuilder" - "biniou" {>= "1.0.6"} - "yojson" {>= "1.2.1"} -] -synopsis: "Runtime library for code generated by atdgen." -url { - src: "https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz" - checksum: "md5=14e47609397c524ea0eae7c3f14f7ccf" -} diff --git a/esy.lock/opam/atdgen.2.0.0/opam b/esy.lock/opam/atdgen.2.0.0/opam deleted file mode 100644 index d71d304..0000000 --- a/esy.lock/opam/atdgen.2.0.0/opam +++ /dev/null @@ -1,44 +0,0 @@ -opam-version: "2.0" -maintainer: "martin@mjambon.com" -authors: ["Martin Jambon"] - -homepage: "https://github.com/mjambon/atd" -bug-reports: "https://github.com/mjambon/atd/issues" -dev-repo: "git://github.com/mjambon/atd.git" - -build: [ - ["jbuilder" "subst" "-p" name] {pinned} - ["jbuilder" "build" "-p" name "-j" jobs] -] - -# Restore when https://github.com/mjambon/atd/issues/121 is resolved. -# build-test: [ -# ["jbuilder" "runtest" "-p" name] -# ] - -depends: [ - "ocaml" {>= "4.03.0"} - "jbuilder" - "atd" {>= "2.0.0"} - "atdgen-runtime" {>= "2.0.0"} - "biniou" {>= "1.0.6"} - "yojson" {>= "1.2.1"} -] -synopsis: - "Generates efficient JSON serializers, deserializers and validators" -description: """ -Atdgen is a command-line program that takes as input type definitions in the -ATD syntax and produces OCaml code suitable for data serialization and -deserialization. - -Two data formats are currently supported, these are biniou and JSON. -Atdgen-biniou and Atdgen-json will refer to Atdgen used in one context or the -other. - -Atdgen was designed with efficiency and durability in mind. Software authors -are encouraged to use Atdgen directly and to write tools that may reuse part of -Atdgen’s source code.""" -url { - src: "https://github.com/mjambon/atd/releases/download/2.0.0/atd-2.0.0.tbz" - checksum: "md5=14e47609397c524ea0eae7c3f14f7ccf" -} diff --git a/esy.lock/opam/base-bytes.base/opam b/esy.lock/opam/base-bytes.base/opam deleted file mode 100644 index f1cae50..0000000 --- a/esy.lock/opam/base-bytes.base/opam +++ /dev/null @@ -1,9 +0,0 @@ -opam-version: "2.0" -maintainer: " " -authors: " " -homepage: " " -depends: [ - "ocaml" {>= "4.02.0"} - "ocamlfind" {>= "1.5.3"} -] -synopsis: "Bytes library distributed with the OCaml compiler" diff --git a/esy.lock/opam/base-threads.base/opam b/esy.lock/opam/base-threads.base/opam deleted file mode 100644 index 914ff50..0000000 --- a/esy.lock/opam/base-threads.base/opam +++ /dev/null @@ -1,6 +0,0 @@ -opam-version: "2.0" -maintainer: "https://github.com/ocaml/opam-repository/issues" -description: """ -Threads library distributed with the OCaml compiler -""" - diff --git a/esy.lock/opam/base-unix.base/opam b/esy.lock/opam/base-unix.base/opam deleted file mode 100644 index b973540..0000000 --- a/esy.lock/opam/base-unix.base/opam +++ /dev/null @@ -1,6 +0,0 @@ -opam-version: "2.0" -maintainer: "https://github.com/ocaml/opam-repository/issues" -description: """ -Unix library distributed with the OCaml compiler -""" - diff --git a/esy.lock/opam/base.v0.13.1/opam b/esy.lock/opam/base.v0.13.1/opam deleted file mode 100644 index e3c61b2..0000000 --- a/esy.lock/opam/base.v0.13.1/opam +++ /dev/null @@ -1,36 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/base" -bug-reports: "https://github.com/janestreet/base/issues" -dev-repo: "git+https://github.com/janestreet/base.git" -doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/base/index.html" -license: "MIT" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.04.2"} - "sexplib0" {>= "v0.13" & < "v0.14"} - "dune" {>= "1.5.1"} - "dune-configurator" -] -synopsis: "Full standard library replacement for OCaml" -description: " -Full standard library replacement for OCaml - -Base is a complete and portable alternative to the OCaml standard -library. It provides all standard functionalities one would expect -from a language standard library. It uses consistent conventions -across all of its module. - -Base aims to be usable in any context. As a result system dependent -features such as I/O are not offered by Base. They are instead -provided by companion libraries such as stdio: - - https://github.com/janestreet/stdio -" -url { - src: "https://github.com/janestreet/base/archive/v0.13.1.tar.gz" - checksum: "md5=296457416f9a8b75e6edfc3b1140e384" -} diff --git a/esy.lock/opam/base64.3.3.0/opam b/esy.lock/opam/base64.3.3.0/opam deleted file mode 100644 index aedc7be..0000000 --- a/esy.lock/opam/base64.3.3.0/opam +++ /dev/null @@ -1,38 +0,0 @@ -opam-version: "2.0" -maintainer: "mirageos-devel@lists.xenproject.org" -authors: [ "Thomas Gazagnaire" - "Anil Madhavapeddy" "Calascibetta Romain" - "Peter Zotov" ] -license: "ISC" -homepage: "https://github.com/mirage/ocaml-base64" -doc: "http://mirage.github.io/ocaml-base64/" -bug-reports: "https://github.com/mirage/ocaml-base64/issues" -dev-repo: "git+https://github.com/mirage/ocaml-base64.git" -synopsis: "Base64 encoding for OCaml" -description: """ -Base64 is a group of similar binary-to-text encoding schemes that represent -binary data in an ASCII string format by translating it into a radix-64 -representation. It is specified in RFC 4648. -""" -depends: [ - "ocaml" {>="4.03.0"} - "base-bytes" - "dune-configurator" - "dune" {>= "2.0"} - "bos" {with-test} - "rresult" {with-test} - "alcotest" {with-test & < "1.0.0"} -] -build: [ - ["dune" "subst"] - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name] {with-test} -] -url { - src: - "https://github.com/mirage/ocaml-base64/releases/download/v3.3.0/base64-v3.3.0.tbz" - checksum: [ - "sha256=3ae91334f029ccd96690b598010f94e55811095d14a37d52f1724e5eca0f35cc" - "sha512=818103de0ac03b9a04f5aafc119341522bf69e57dfbd038b321f92ab8cbf7fc7084ca3012086baece12da94d4d5448eb927f70b741025a13d49e93ca6ea27d41" - ] -} diff --git a/esy.lock/opam/bigarray-compat.1.0.0/opam b/esy.lock/opam/bigarray-compat.1.0.0/opam deleted file mode 100644 index 9375151..0000000 --- a/esy.lock/opam/bigarray-compat.1.0.0/opam +++ /dev/null @@ -1,23 +0,0 @@ -opam-version: "2.0" -synopsis: "Compatibility library to use Stdlib.Bigarray when possible" -maintainer: "Lucas Pluvinage " -authors: "Lucas Pluvinage " -license: "ISC" -homepage: "https://github.com/mirage/bigarray-compat" -bug-reports: "https://github.com/mirage/bigarray-compat/issues" -depends: [ - "ocaml" {>= "4.03.0"} - "dune" {>= "1.0"} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] -] -dev-repo: "git+https://github.com/mirage/bigarray-compat.git" -url { - src: "https://github.com/mirage/bigarray-compat/archive/v1.0.0.tar.gz" - checksum: [ - "md5=1cc7c25382a8900bada34aadfd66632e" - "sha512=c365fee15582aca35d7b05268cde29e54774ad7df7be56762b4aad78ca1409d4326ad3b34af0f1cc2c7b872837290a9cd9ff43b47987c03bba7bba32fe8a030f" - ] -} \ No newline at end of file diff --git a/esy.lock/opam/biniou.1.2.1/opam b/esy.lock/opam/biniou.1.2.1/opam deleted file mode 100644 index b706b42..0000000 --- a/esy.lock/opam/biniou.1.2.1/opam +++ /dev/null @@ -1,45 +0,0 @@ -opam-version: "2.0" -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} - ["dune" "build" "-p" name "@doc"] {with-doc} -] -maintainer: ["martin@mjambon.com"] -authors: ["Martin Jambon"] -bug-reports: "https://github.com/mjambon/biniou/issues" -homepage: "https://github.com/mjambon/biniou" -doc: "https://mjambon.github.io/biniou/" -license: "BSD-3-Clause" -dev-repo: "git+https://github.com/mjambon/biniou.git" -synopsis: - "Binary data format designed for speed, safety, ease of use and backward compatibility as protocols evolve" -description: """ - -Biniou (pronounced "be new") is a binary data format designed for speed, safety, -ease of use and backward compatibility as protocols evolve. Biniou is vastly -equivalent to JSON in terms of functionality but allows implementations several -times faster (4 times faster than yojson), with 25-35% space savings. - -Biniou data can be decoded into human-readable form without knowledge of type -definitions except for field and variant names which are represented by 31-bit -hashes. A program named bdump is provided for routine visualization of biniou -data files. - -The program atdgen is used to derive OCaml-Biniou serializers and deserializers -from type definitions. - -Biniou format specification: mjambon.github.io/atdgen-doc/biniou-format.txt""" -depends: [ - "easy-format" - "dune" {>= "1.10"} - "ocaml" {>= "4.02.3"} -] -url { - src: - "https://github.com/mjambon/biniou/releases/download/1.2.1/biniou-1.2.1.tbz" - checksum: [ - "sha256=35546c68b1929a8e6d27a3b39ecd17b38303a0d47e65eb9d1480c2061ea84335" - "sha512=82670cc77bf3e869ee26e5fbe5a5affa45a22bc8b6c4bd7e85473912780e0111baca59b34a2c14feae3543ce6e239d7fddaeab24b686a65bfe642cdb91d27ebf" - ] -} diff --git a/esy.lock/opam/cmdliner.1.0.4/opam b/esy.lock/opam/cmdliner.1.0.4/opam deleted file mode 100644 index b2187dc..0000000 --- a/esy.lock/opam/cmdliner.1.0.4/opam +++ /dev/null @@ -1,36 +0,0 @@ -opam-version: "2.0" -maintainer: "Daniel Bünzli " -authors: ["Daniel Bünzli "] -homepage: "http://erratique.ch/software/cmdliner" -doc: "http://erratique.ch/software/cmdliner/doc/Cmdliner" -dev-repo: "git+http://erratique.ch/repos/cmdliner.git" -bug-reports: "https://github.com/dbuenzli/cmdliner/issues" -tags: [ "cli" "system" "declarative" "org:erratique" ] -license: "ISC" -depends:[ "ocaml" {>= "4.03.0"} ] -build: [[ make "all" "PREFIX=%{prefix}%" ]] -install: -[[make "install" "LIBDIR=%{_:lib}%" "DOCDIR=%{_:doc}%" ] - [make "install-doc" "LIBDIR=%{_:lib}%" "DOCDIR=%{_:doc}%" ]] - -synopsis: """Declarative definition of command line interfaces for OCaml""" -description: """\ - -Cmdliner allows the declarative definition of command line interfaces -for OCaml. - -It provides a simple and compositional mechanism to convert command -line arguments to OCaml values and pass them to your functions. The -module automatically handles syntax errors, help messages and UNIX man -page generation. It supports programs with single or multiple commands -and respects most of the [POSIX][1] and [GNU][2] conventions. - -Cmdliner has no dependencies and is distributed under the ISC license. - -[1]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html -[2]: http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html -""" -url { -archive: "http://erratique.ch/software/cmdliner/releases/cmdliner-1.0.4.tbz" -checksum: "fe2213d0bc63b1e10a2d0aa66d2fc8d9" -} diff --git a/esy.lock/opam/cohttp-lwt-unix.2.5.1/opam b/esy.lock/opam/cohttp-lwt-unix.2.5.1/opam deleted file mode 100644 index 8cece4e..0000000 --- a/esy.lock/opam/cohttp-lwt-unix.2.5.1/opam +++ /dev/null @@ -1,53 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: [ - "Anil Madhavapeddy" - "Stefano Zacchiroli" - "David Sheets" - "Thomas Gazagnaire" - "David Scott" - "Rudi Grinberg" - "Andy Ray" -] -synopsis: "CoHTTP implementation for Unix and Windows using Lwt" -description: """ -An implementation of an HTTP client and server using the Lwt -concurrency library. See the `Cohttp_lwt_unix` module for information -on how to use this. The package also installs `cohttp-curl-lwt` -and a `cohttp-server-lwt` binaries for quick uses of a HTTP(S) -client and server respectively. - -Although the name implies that this only works under Unix, it -should also be fine under Windows too.""" -license: "ISC" -tags: ["org:mirage" "org:xapi-project"] -homepage: "https://github.com/mirage/ocaml-cohttp" -doc: "https://mirage.github.io/ocaml-cohttp/" -bug-reports: "https://github.com/mirage/ocaml-cohttp/issues" -depends: [ - "ocaml" {>= "4.04.1"} - "dune" {>= "1.1.0"} - "conduit-lwt-unix" {>= "1.0.3"} - "cmdliner" - "magic-mime" - "logs" - "fmt" {>= "0.8.2"} - "cohttp-lwt" {=version} - "lwt" {>= "3.0.0"} - "base-unix" - "ounit" {with-test} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/mirage/ocaml-cohttp.git" -url { - src: - "https://github.com/mirage/ocaml-cohttp/releases/download/v2.5.1/cohttp-v2.5.1.tbz" - checksum: [ - "sha256=268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946" - "sha512=051aa57ad631ba766f22f6ebc0746545fc74ca1180206c695deb1ca73800f7ea436c88f95a0bb1d78a8dc1da0685a19553cdacd04667893022215bedbc2b880a" - ] -} diff --git a/esy.lock/opam/cohttp-lwt.2.5.1/opam b/esy.lock/opam/cohttp-lwt.2.5.1/opam deleted file mode 100644 index e43ee33..0000000 --- a/esy.lock/opam/cohttp-lwt.2.5.1/opam +++ /dev/null @@ -1,49 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: [ - "Anil Madhavapeddy" - "Stefano Zacchiroli" - "David Sheets" - "Thomas Gazagnaire" - "David Scott" - "Rudi Grinberg" - "Andy Ray" -] -synopsis: "CoHTTP implementation using the Lwt concurrency library" -description: """ -This is a portable implementation of HTTP that uses the Lwt -concurrency library to multiplex IO. It implements as much of the -logic in an OS-independent way as possible, so that more specialised -modules can be tailored for different targets. For example, you -can install `cohttp-lwt-unix` or `cohttp-lwt-jsoo` for a Unix or -JavaScript backend, or `cohttp-mirage` for the MirageOS unikernel -version of the library. All of these implementations share the same -IO logic from this module.""" -license: "ISC" -tags: ["org:mirage" "org:xapi-project"] -homepage: "https://github.com/mirage/ocaml-cohttp" -doc: "https://mirage.github.io/ocaml-cohttp/" -bug-reports: "https://github.com/mirage/ocaml-cohttp/issues" -depends: [ - "ocaml" {>= "4.04.1"} - "dune" {>= "1.1.0"} - "cohttp" {=version} - "lwt" {>= "2.5.0"} - "sexplib0" - "ppx_sexp_conv" {>= "v0.13.0"} - "logs" -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/mirage/ocaml-cohttp.git" -url { - src: - "https://github.com/mirage/ocaml-cohttp/releases/download/v2.5.1/cohttp-v2.5.1.tbz" - checksum: [ - "sha256=268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946" - "sha512=051aa57ad631ba766f22f6ebc0746545fc74ca1180206c695deb1ca73800f7ea436c88f95a0bb1d78a8dc1da0685a19553cdacd04667893022215bedbc2b880a" - ] -} diff --git a/esy.lock/opam/cohttp.2.5.1/opam b/esy.lock/opam/cohttp.2.5.1/opam deleted file mode 100644 index 0ffdde6..0000000 --- a/esy.lock/opam/cohttp.2.5.1/opam +++ /dev/null @@ -1,64 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: [ - "Anil Madhavapeddy" - "Stefano Zacchiroli" - "David Sheets" - "Thomas Gazagnaire" - "David Scott" - "Rudi Grinberg" - "Andy Ray" -] -synopsis: "An OCaml library for HTTP clients and servers" -description: """ -Cohttp is an OCaml library for creating HTTP daemons. It has a portable -HTTP parser, and implementations using various asynchronous programming -libraries. - -See the cohttp-async, cohttp-lwt, cohttp-lwt-unix, cohttp-lwt-jsoo and -cohttp-mirage libraries for concrete implementations for particular -targets. - -You can implement other targets using the parser very easily. Look at the `IO` -signature in `lib/s.mli` and implement that in the desired backend. - -You can activate some runtime debugging by setting `COHTTP_DEBUG` to any -value, and all requests and responses will be written to stderr. Further -debugging of the connection layer can be obtained by setting `CONDUIT_DEBUG` -to any value.""" -license: "ISC" -tags: ["org:mirage" "org:xapi-project"] -homepage: "https://github.com/mirage/ocaml-cohttp" -doc: "https://mirage.github.io/ocaml-cohttp/" -bug-reports: "https://github.com/mirage/ocaml-cohttp/issues" -depends: [ - "ocaml" {>= "4.04.1"} - "dune" {>= "1.1.0"} - "re" {>= "1.9.0"} - "uri" {>= "2.0.0"} - "uri-sexp" - "fieldslib" - "sexplib0" - "ppx_fields_conv" {>= "v0.9.0"} - "ppx_sexp_conv" {>= "v0.13.0"} - "stringext" - "base64" {>= "3.1.0"} - "stdlib-shims" - "fmt" {with-test} - "jsonm" {build} - "alcotest" {with-test} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/mirage/ocaml-cohttp.git" -url { - src: - "https://github.com/mirage/ocaml-cohttp/releases/download/v2.5.1/cohttp-v2.5.1.tbz" - checksum: [ - "sha256=268de1479bf010c16f1de1ab5f9c75595dfdcafb2017ed4e73f8773b620da946" - "sha512=051aa57ad631ba766f22f6ebc0746545fc74ca1180206c695deb1ca73800f7ea436c88f95a0bb1d78a8dc1da0685a19553cdacd04667893022215bedbc2b880a" - ] -} diff --git a/esy.lock/opam/conduit-lwt-unix.2.0.2/opam b/esy.lock/opam/conduit-lwt-unix.2.0.2/opam deleted file mode 100644 index 1ea42ed..0000000 --- a/esy.lock/opam/conduit-lwt-unix.2.0.2/opam +++ /dev/null @@ -1,39 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: [ - "Anil Madhavapeddy" "Thomas Leonard" "Thomas Gazagnaire" "Rudi Grinberg" -] -license: "ISC" -tags: "org:mirage" -homepage: "https://github.com/mirage/ocaml-conduit" -bug-reports: "https://github.com/mirage/ocaml-conduit/issues" -depends: [ - "ocaml" {>= "4.03.0"} - "dune" - "base-unix" - "ppx_sexp_conv" {>= "v0.9.0" & < "v0.14"} - "conduit-lwt" {=version} - "lwt" {>= "3.0.0"} - "uri" {>= "1.9.4"} - "ipaddr" {>= "4.0.0"} - "ipaddr-sexp" -] -depopts: ["tls" "lwt_ssl" "launchd"] -conflicts: [ - "tls" {< "0.8.0"} - "ssl" {< "0.5.9"} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] -] -dev-repo: "git+https://github.com/mirage/ocaml-conduit.git" -synopsis: "A network connection establishment library for Lwt_unix" -url { - src: - "https://github.com/mirage/ocaml-conduit/releases/download/v2.0.2/conduit-v2.0.2.tbz" - checksum: [ - "sha256=2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2" - "sha512=3e25b754c84dd603acbb4d810b532c3cfb273808b9bf9a17890e40b79e65529d17cd66d613a447cb2a7f51f0522f17d46ab0ade5c79cb2a3c8565efd484238ae" - ] -} diff --git a/esy.lock/opam/conduit-lwt.2.0.2/opam b/esy.lock/opam/conduit-lwt.2.0.2/opam deleted file mode 100644 index 54dce05..0000000 --- a/esy.lock/opam/conduit-lwt.2.0.2/opam +++ /dev/null @@ -1,32 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: [ - "Anil Madhavapeddy" "Thomas Leonard" "Thomas Gazagnaire" "Rudi Grinberg" -] -license: "ISC" -tags: "org:mirage" -homepage: "https://github.com/mirage/ocaml-conduit" -bug-reports: "https://github.com/mirage/ocaml-conduit/issues" -depends: [ - "ocaml" {>= "4.03.0"} - "dune" - "base-unix" - "ppx_sexp_conv" {>= "v0.9.0" & < "v0.14"} - "sexplib" {< "v0.14"} - "conduit" {=version} - "lwt" {>= "3.0.0"} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] -] -dev-repo: "git+https://github.com/mirage/ocaml-conduit.git" -synopsis: "A portable network connection establishment library using Lwt" -url { - src: - "https://github.com/mirage/ocaml-conduit/releases/download/v2.0.2/conduit-v2.0.2.tbz" - checksum: [ - "sha256=2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2" - "sha512=3e25b754c84dd603acbb4d810b532c3cfb273808b9bf9a17890e40b79e65529d17cd66d613a447cb2a7f51f0522f17d46ab0ade5c79cb2a3c8565efd484238ae" - ] -} diff --git a/esy.lock/opam/conduit.2.0.2/opam b/esy.lock/opam/conduit.2.0.2/opam deleted file mode 100644 index b3404dc..0000000 --- a/esy.lock/opam/conduit.2.0.2/opam +++ /dev/null @@ -1,56 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: [ - "Anil Madhavapeddy" "Thomas Leonard" "Thomas Gazagnaire" "Rudi Grinberg" -] -license: "ISC" -tags: "org:mirage" -homepage: "https://github.com/mirage/ocaml-conduit" -doc: "https://mirage.github.io/ocaml-conduit/" -bug-reports: "https://github.com/mirage/ocaml-conduit/issues" -depends: [ - "ocaml" {>= "4.03.0"} - "dune" - "ppx_sexp_conv" {>= "v0.9.0" & < "v0.14"} - "sexplib" {< "v0.14"} - "astring" - "uri" - "logs" {>= "0.5.0"} - "ipaddr" {>= "4.0.0"} - "ipaddr-sexp" -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] -] -dev-repo: "git+https://github.com/mirage/ocaml-conduit.git" -synopsis: "A network connection establishment library" -description: """ -The `conduit` library takes care of establishing and listening for -TCP and SSL/TLS connections for the Lwt and Async libraries. - -The reason this library exists is to provide a degree of abstraction -from the precise SSL library used, since there are a variety of ways -to bind to a library (e.g. the C FFI, or the Ctypes library), as well -as well as which library is used (just OpenSSL for now). - -By default, OpenSSL is used as the preferred connection library, but -you can force the use of the pure OCaml TLS stack by setting the -environment variable `CONDUIT_TLS=native` when starting your program. - -The useful opam packages available that extend this library are: - -- `conduit`: the main `Conduit` module -- `conduit-lwt`: the portable Lwt implementation -- `conduit-lwt-unix`: the Lwt/Unix implementation -- `conduit-async` the Jane Street Async implementation -- `conduit-mirage`: the MirageOS compatible implementation -""" -url { - src: - "https://github.com/mirage/ocaml-conduit/releases/download/v2.0.2/conduit-v2.0.2.tbz" - checksum: [ - "sha256=2510372ed98c7e0446d788317a435f752d900d72df0fbe4c353f5e5bfb9d1dd2" - "sha512=3e25b754c84dd603acbb4d810b532c3cfb273808b9bf9a17890e40b79e65529d17cd66d613a447cb2a7f51f0522f17d46ab0ade5c79cb2a3c8565efd484238ae" - ] -} diff --git a/esy.lock/opam/conf-m4.1/opam b/esy.lock/opam/conf-m4.1/opam deleted file mode 100644 index c6feb2a..0000000 --- a/esy.lock/opam/conf-m4.1/opam +++ /dev/null @@ -1,22 +0,0 @@ -opam-version: "2.0" -maintainer: "tim@gfxmonk.net" -homepage: "http://www.gnu.org/software/m4/m4.html" -bug-reports: "https://github.com/ocaml/opam-repository/issues" -authors: "GNU Project" -license: "GPL-3.0-only" -build: [["sh" "-exc" "echo | m4"]] -depexts: [ - ["m4"] {os-family = "debian"} - ["m4"] {os-distribution = "fedora"} - ["m4"] {os-distribution = "rhel"} - ["m4"] {os-distribution = "centos"} - ["m4"] {os-distribution = "alpine"} - ["m4"] {os-distribution = "nixos"} - ["m4"] {os-family = "suse"} - ["m4"] {os-distribution = "ol"} - ["m4"] {os-distribution = "arch"} -] -synopsis: "Virtual package relying on m4" -description: - "This package can only install if the m4 binary is installed on the system." -flags: conf diff --git a/esy.lock/opam/conf-perl.1/opam b/esy.lock/opam/conf-perl.1/opam deleted file mode 100644 index 7886c6f..0000000 --- a/esy.lock/opam/conf-perl.1/opam +++ /dev/null @@ -1,18 +0,0 @@ -opam-version: "2.0" -maintainer: "tim@gfxmonk.net" -homepage: "https://www.perl.org/" -bug-reports: "https://github.com/ocaml/opam-repository/issues" -license: "GPL-1.0-or-later" -authors: "Larry Wall" -build: [["perl" "--version"]] -depexts: [ - ["perl"] {os-family = "debian"} - ["perl"] {os-distribution = "alpine"} - ["perl"] {os-distribution = "nixos"} - ["perl"] {os-distribution = "arch"} - ["perl-Pod-Html"] {os-distribution = "fedora"} -] -synopsis: "Virtual package relying on perl" -description: - "This package can only install if the perl program is installed on the system." -flags: conf diff --git a/esy.lock/opam/cppo.1.6.6/opam b/esy.lock/opam/cppo.1.6.6/opam deleted file mode 100644 index f683f8b..0000000 --- a/esy.lock/opam/cppo.1.6.6/opam +++ /dev/null @@ -1,37 +0,0 @@ -opam-version: "2.0" -maintainer: "martin@mjambon.com" -authors: "Martin Jambon" -license: "BSD-3-Clause" -homepage: "http://mjambon.com/cppo.html" -doc: "https://ocaml-community.github.io/cppo/" -bug-reports: "https://github.com/ocaml-community/cppo/issues" -depends: [ - "ocaml" {>= "4.03"} - "dune" {>= "1.0"} - "base-unix" -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/ocaml-community/cppo.git" -synopsis: "Code preprocessor like cpp for OCaml" -description: """ -Cppo is an equivalent of the C preprocessor for OCaml programs. -It allows the definition of simple macros and file inclusion. - -Cppo is: - -* more OCaml-friendly than cpp -* easy to learn without consulting a manual -* reasonably fast -* simple to install and to maintain -""" -url { - src: "https://github.com/ocaml-community/cppo/releases/download/v1.6.6/cppo-v1.6.6.tbz" - checksum: [ - "sha256=e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0" - "sha512=44ecf9d225d9e45490a2feac0bde04865ca398dba6c3579e3370fcd1ea255707b8883590852af8b2df87123801062b9f3acce2455c092deabf431f9c4fb8d8eb" - ] -} diff --git a/esy.lock/opam/cpuid.0.1.2/opam b/esy.lock/opam/cpuid.0.1.2/opam deleted file mode 100644 index fe2efa1..0000000 --- a/esy.lock/opam/cpuid.0.1.2/opam +++ /dev/null @@ -1,22 +0,0 @@ -opam-version: "2.0" -maintainer: "David Kaloper Meršinjak " -authors: ["David Kaloper Meršinjak "] -homepage: "https://github.com/pqwy/cpuid" -doc: "https://pqwy.github.io/cpuid/doc" -license: "ISC" -dev-repo: "git+https://github.com/pqwy/cpuid.git" -bug-reports: "https://github.com/pqwy/cpuid/issues" -build: [ ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs ] - ["dune" "runtest"] {with-test} ] -depends: [ - "ocaml" {>="4.03.0"} - "dune" {>= "1.7"} - ] -synopsis: "Detect CPU features" -description: "CPUID" -url { - src: - "https://github.com/pqwy/cpuid/releases/download/v0.1.2/cpuid-v0.1.2.tbz" - checksum: "md5=21079a17bcf6cfe92e2f706b9d0d6d8d" -} diff --git a/esy.lock/opam/cstruct-lwt.5.1.1/opam b/esy.lock/opam/cstruct-lwt.5.1.1/opam deleted file mode 100644 index 4ce24c9..0000000 --- a/esy.lock/opam/cstruct-lwt.5.1.1/opam +++ /dev/null @@ -1,35 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: ["Anil Madhavapeddy" "Richard Mortier" "Thomas Gazagnaire" - "Pierre Chambart" "David Kaloper" "Jeremy Yallop" "David Scott" - "Mindy Preston" "Thomas Leonard" "Etienne Millon" ] -homepage: "https://github.com/mirage/ocaml-cstruct" -license: "ISC" -dev-repo: "git+https://github.com/mirage/ocaml-cstruct.git" -bug-reports: "https://github.com/mirage/ocaml-cstruct/issues" -doc: "https://mirage.github.io/ocaml-cstruct/" -tags: [ "org:mirage" "org:ocamllabs" ] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.03.0"} - "base-unix" - "dune" - "lwt" - "cstruct" {=version} -] -synopsis: "Access C-like structures directly from OCaml" -description: """ -Cstruct is a library and syntax extension to make it easier to access C-like -structures directly from OCaml. It supports both reading and writing to these -structures, and they are accessed via the `Bigarray` module.""" -url { - src: - "https://github.com/mirage/ocaml-cstruct/releases/download/v5.1.1/cstruct-v5.1.1.tbz" - checksum: [ - "sha256=55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3" - "sha512=c3aa9a5a9125a1d022506a76fd7cdf32b21edcdc9df1202d8a9f382d02a28a33fea9a958f79e9302907ade1fce3f166b620c320aed6486e3efcc9a7464379cab" - ] -} diff --git a/esy.lock/opam/cstruct-sexp.5.1.1/opam b/esy.lock/opam/cstruct-sexp.5.1.1/opam deleted file mode 100644 index 1ffb2ff..0000000 --- a/esy.lock/opam/cstruct-sexp.5.1.1/opam +++ /dev/null @@ -1,39 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: ["Anil Madhavapeddy" "Richard Mortier" "Thomas Gazagnaire" - "Pierre Chambart" "David Kaloper" "Jeremy Yallop" "David Scott" - "Mindy Preston" "Thomas Leonard" "Anton Kochkov" "Etienne Millon" ] -homepage: "https://github.com/mirage/ocaml-cstruct" -license: "ISC" -dev-repo: "git+https://github.com/mirage/ocaml-cstruct.git" -bug-reports: "https://github.com/mirage/ocaml-cstruct/issues" -doc: "https://mirage.github.io/ocaml-cstruct/" - -tags: [ "org:mirage" "org:ocamllabs" ] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -depends: [ - "ocaml" {>= "4.03.0"} - "dune" - "sexplib" - "cstruct" {=version} - "alcotest" {with-test} -] -synopsis: "S-expression serialisers for C-like structures" -description: """ -Cstruct is a library and syntax extension to make it easier to access C-like -structures directly from OCaml. It supports both reading and writing to these -structures, and they are accessed via the `Bigarray` module. - -This library provides Sexplib serialisers for the Cstruct.t values.""" -url { - src: - "https://github.com/mirage/ocaml-cstruct/releases/download/v5.1.1/cstruct-v5.1.1.tbz" - checksum: [ - "sha256=55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3" - "sha512=c3aa9a5a9125a1d022506a76fd7cdf32b21edcdc9df1202d8a9f382d02a28a33fea9a958f79e9302907ade1fce3f166b620c320aed6486e3efcc9a7464379cab" - ] -} diff --git a/esy.lock/opam/cstruct.5.1.1/opam b/esy.lock/opam/cstruct.5.1.1/opam deleted file mode 100644 index 0f04e62..0000000 --- a/esy.lock/opam/cstruct.5.1.1/opam +++ /dev/null @@ -1,37 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: ["Anil Madhavapeddy" "Richard Mortier" "Thomas Gazagnaire" - "Pierre Chambart" "David Kaloper" "Jeremy Yallop" "David Scott" - "Mindy Preston" "Thomas Leonard" "Anton Kochkov" "Etienne Millon" ] -homepage: "https://github.com/mirage/ocaml-cstruct" -license: "ISC" -dev-repo: "git+https://github.com/mirage/ocaml-cstruct.git" -bug-reports: "https://github.com/mirage/ocaml-cstruct/issues" -doc: "https://mirage.github.io/ocaml-cstruct/" - -tags: [ "org:mirage" "org:ocamllabs" ] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -depends: [ - "ocaml" {>= "4.03.0"} - "dune" - "bigarray-compat" - "alcotest" {with-test} -] -conflicts: [ "js_of_ocaml" {<"3.5.0"} ] -synopsis: "Access C-like structures directly from OCaml" -description: """ -Cstruct is a library and syntax extension to make it easier to access C-like -structures directly from OCaml. It supports both reading and writing to these -structures, and they are accessed via the `Bigarray` module.""" -url { - src: - "https://github.com/mirage/ocaml-cstruct/releases/download/v5.1.1/cstruct-v5.1.1.tbz" - checksum: [ - "sha256=55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3" - "sha512=c3aa9a5a9125a1d022506a76fd7cdf32b21edcdc9df1202d8a9f382d02a28a33fea9a958f79e9302907ade1fce3f166b620c320aed6486e3efcc9a7464379cab" - ] -} diff --git a/esy.lock/opam/domain-name.0.3.0/opam b/esy.lock/opam/domain-name.0.3.0/opam deleted file mode 100644 index 298475c..0000000 --- a/esy.lock/opam/domain-name.0.3.0/opam +++ /dev/null @@ -1,37 +0,0 @@ -opam-version: "2.0" -maintainer: "Hannes Mehnert " -authors: "Hannes Mehnert " -license: "ISC" -homepage: "https://github.com/hannesm/domain-name" -doc: "https://hannesm.github.io/domain-name/doc" -bug-reports: "https://github.com/hannesm/domain-name/issues" -depends: [ - "ocaml" {>= "4.04.2"} - "dune" - "fmt" - "astring" - "alcotest" {with-test} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/hannesm/domain-name.git" -synopsis: "RFC 1035 Internet domain names" -description: """ -A domain name is a sequence of labels separated by dots, such as `foo.example`. -Each label may contain any bytes. The length of each label may not exceed 63 -charactes. The total length of a domain name is limited to 253 (byte -representation is 255), but other protocols (such as SMTP) may apply even -smaller limits. A domain name label is case preserving, comparison is done in a -case insensitive manner. -""" -url { - src: - "https://github.com/hannesm/domain-name/releases/download/v0.3.0/domain-name-v0.3.0.tbz" - checksum: [ - "sha256=4dd9ed1bc619886d1adcaff14edfb503dedb77fc0b7a28d88d213aa1c44d6c8a" - "sha512=8229766b20a44622d3a94250c6909dbe64269aab6dde8dd13f6b1c027d63e119658fd35b459c6556817ab583bbfdbc5dbea97d3022f590184d70a72ecd7c0a34" - ] -} diff --git a/esy.lock/opam/dune-configurator.2.3.1/opam b/esy.lock/opam/dune-configurator.2.3.1/opam deleted file mode 100644 index fe4119d..0000000 --- a/esy.lock/opam/dune-configurator.2.3.1/opam +++ /dev/null @@ -1,43 +0,0 @@ -opam-version: "2.0" -synopsis: "Helper library for gathering system configuration" -description: """ -dune-configurator is a small library that helps writing OCaml scripts that -test features available on the system, in order to generate config.h -files for instance. -Among other things, dune-configurator allows one to: -- test if a C program compiles -- query pkg-config -- import #define from OCaml header files -- generate config.h file -""" -maintainer: ["Jane Street Group, LLC "] -authors: ["Jane Street Group, LLC "] -license: "MIT" -homepage: "https://github.com/ocaml/dune" -doc: "https://dune.readthedocs.io/" -bug-reports: "https://github.com/ocaml/dune/issues" -depends: [ - "dune" {>= "2.3"} - "dune-private-libs" {= version} -] -dev-repo: "git+https://github.com/ocaml/dune.git" -build: [ - ["dune" "subst"] {pinned} - [ - "dune" - "build" - "-p" - name - "-j" - jobs - "@install" - "@doc" {with-doc} - ] -] -url { - src: "https://github.com/ocaml/dune/releases/download/2.3.1/dune-2.3.1.tbz" - checksum: [ - "sha256=b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb" - "sha512=023fe4ddf743b8de24de0d7d2e6d5d0f85e459c5044aa4ba3de02cf63113d54d79004cc8ea8f7a958b324e9cbeef0845ec6a0f65454bc6a2e635e8944d28a0f9" - ] -} diff --git a/esy.lock/opam/dune-private-libs.2.3.1/opam b/esy.lock/opam/dune-private-libs.2.3.1/opam deleted file mode 100644 index caac6d7..0000000 --- a/esy.lock/opam/dune-private-libs.2.3.1/opam +++ /dev/null @@ -1,42 +0,0 @@ -opam-version: "2.0" -synopsis: "Private libraries of Dune" -description: """ -!!!!!!!!!!!!!!!!!!!!!! -!!!!! DO NOT USE !!!!! -!!!!!!!!!!!!!!!!!!!!!! - -This package contains code that is shared between various dune-xxx -packages. However, it is not meant for public consumption and provides -no stability guarantee. -""" -maintainer: ["Jane Street Group, LLC "] -authors: ["Jane Street Group, LLC "] -license: "MIT" -homepage: "https://github.com/ocaml/dune" -doc: "https://dune.readthedocs.io/" -bug-reports: "https://github.com/ocaml/dune/issues" -depends: [ - "dune" {>= "2.3"} - "ocaml" {>= "4.07"} -] -dev-repo: "git+https://github.com/ocaml/dune.git" -build: [ - ["dune" "subst"] {pinned} - [ - "dune" - "build" - "-p" - name - "-j" - jobs - "@install" - "@doc" {with-doc} - ] -] -url { - src: "https://github.com/ocaml/dune/releases/download/2.3.1/dune-2.3.1.tbz" - checksum: [ - "sha256=b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb" - "sha512=023fe4ddf743b8de24de0d7d2e6d5d0f85e459c5044aa4ba3de02cf63113d54d79004cc8ea8f7a958b324e9cbeef0845ec6a0f65454bc6a2e635e8944d28a0f9" - ] -} diff --git a/esy.lock/opam/dune.2.3.1/opam b/esy.lock/opam/dune.2.3.1/opam deleted file mode 100644 index 5155cba..0000000 --- a/esy.lock/opam/dune.2.3.1/opam +++ /dev/null @@ -1,54 +0,0 @@ -opam-version: "2.0" -synopsis: "Fast, portable, and opinionated build system" -description: """ - -dune is a build system that was designed to simplify the release of -Jane Street packages. It reads metadata from "dune" files following a -very simple s-expression syntax. - -dune is fast, has very low-overhead, and supports parallel builds on -all platforms. It has no system dependencies; all you need to build -dune or packages using dune is OCaml. You don't need make or bash -as long as the packages themselves don't use bash explicitly. - -dune supports multi-package development by simply dropping multiple -repositories into the same directory. - -It also supports multi-context builds, such as building against -several opam roots/switches simultaneously. This helps maintaining -packages across several versions of OCaml and gives cross-compilation -for free. -""" -maintainer: ["Jane Street Group, LLC "] -authors: ["Jane Street Group, LLC "] -license: "MIT" -homepage: "https://github.com/ocaml/dune" -doc: "https://dune.readthedocs.io/" -bug-reports: "https://github.com/ocaml/dune/issues" -conflicts: [ - "dune-configurator" {< "2.3.0"} - "odoc" {< "1.3.0"} - "dune-release" {< "1.3.0"} - "jbuilder" {= "transition"} -] -dev-repo: "git+https://github.com/ocaml/dune.git" -build: [ - # opam 2 sets OPAM_SWITCH_PREFIX, so we don't need a hardcoded path - ["ocaml" "configure.ml" "--libdir" lib] {opam-version < "2"} - ["ocaml" "bootstrap.ml" "-j" jobs] - ["./dune.exe" "build" "-p" name "--profile" "dune-bootstrap" "-j" jobs] -] -depends: [ - # Please keep the lower bound in sync with .travis.yml, dune-project - # and min_ocaml_version in bootstrap.ml - ("ocaml" {>= "4.07"} | ("ocaml" {< "4.07~~"} & "ocamlfind-secondary")) - "base-unix" - "base-threads" -] -url { - src: "https://github.com/ocaml/dune/releases/download/2.3.1/dune-2.3.1.tbz" - checksum: [ - "sha256=b2b3dd9cdfd34ef8c4583ea8c52c3503c2395bf94c264af19d6450547e12f5cb" - "sha512=023fe4ddf743b8de24de0d7d2e6d5d0f85e459c5044aa4ba3de02cf63113d54d79004cc8ea8f7a958b324e9cbeef0845ec6a0f65454bc6a2e635e8944d28a0f9" - ] -} diff --git a/esy.lock/opam/easy-format.1.3.2/opam b/esy.lock/opam/easy-format.1.3.2/opam deleted file mode 100644 index 138d0fb..0000000 --- a/esy.lock/opam/easy-format.1.3.2/opam +++ /dev/null @@ -1,46 +0,0 @@ -opam-version: "2.0" -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} - ["dune" "build" "-p" name "@doc"] {with-doc} -] -maintainer: ["martin@mjambon.com" "rudi.grinberg@gmail.com"] -authors: ["Martin Jambon"] -bug-reports: "https://github.com/mjambon/easy-format/issues" -homepage: "https://github.com/mjambon/easy-format" -doc: "https://mjambon.github.io/easy-format/" -license: "BSD-3-Clause" -dev-repo: "git+https://github.com/mjambon/easy-format.git" -synopsis: - "High-level and functional interface to the Format module of the OCaml standard library" -description: """ - -This module offers a high-level and functional interface to the Format module of -the OCaml standard library. It is a pretty-printing facility, i.e. it takes as -input some code represented as a tree and formats this code into the most -visually satisfying result, breaking and indenting lines of code where -appropriate. - -Input data must be first modelled and converted into a tree using 3 kinds of -nodes: - -* atoms -* lists -* labelled nodes - -Atoms represent any text that is guaranteed to be printed as-is. Lists can model -any sequence of items such as arrays of data or lists of definitions that are -labelled with something like "int main", "let x =" or "x:".""" -depends: [ - "dune" {>= "1.10"} - "ocaml" {>= "4.02.3"} -] -url { - src: - "https://github.com/mjambon/easy-format/releases/download/1.3.2/easy-format-1.3.2.tbz" - checksum: [ - "sha256=3440c2b882d537ae5e9011eb06abb53f5667e651ea4bb3b460ea8230fa8c1926" - "sha512=e39377a2ff020ceb9ac29e8515a89d9bdbc91dfcfa871c4e3baafa56753fac2896768e5d9822a050dc1e2ade43c8967afb69391a386c0a8ecd4e1f774e236135" - ] -} diff --git a/esy.lock/opam/fieldslib.v0.13.0/opam b/esy.lock/opam/fieldslib.v0.13.0/opam deleted file mode 100644 index ce47ec2..0000000 --- a/esy.lock/opam/fieldslib.v0.13.0/opam +++ /dev/null @@ -1,27 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/fieldslib" -bug-reports: "https://github.com/janestreet/fieldslib/issues" -dev-repo: "git+https://github.com/janestreet/fieldslib.git" -doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/fieldslib/index.html" -license: "MIT" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.04.2"} - "base" {>= "v0.13" & < "v0.14"} - "dune" {>= "1.5.1"} -] -synopsis: "Syntax extension to define first class values representing record fields, to get and set record fields, iterate and fold over all fields of a record and create new record values" -description: " -Part of Jane Street's Core library -The Core suite of libraries is an industrial strength alternative to -OCaml's standard library that was developed by Jane Street, the -largest industrial user of OCaml. -" -url { - src: "https://ocaml.janestreet.com/ocaml-core/v0.13/files/fieldslib-v0.13.0.tar.gz" - checksum: "md5=3ac72dc49e43416c8b6fa0897bd4838b" -} diff --git a/esy.lock/opam/fmt.0.8.8/opam b/esy.lock/opam/fmt.0.8.8/opam deleted file mode 100644 index f493b5f..0000000 --- a/esy.lock/opam/fmt.0.8.8/opam +++ /dev/null @@ -1,44 +0,0 @@ -opam-version: "2.0" -maintainer: "Daniel Bünzli " -authors: [ "The fmt programmers" ] -homepage: "https://erratique.ch/software/fmt" -doc: "https://erratique.ch/software/fmt" -dev-repo: "git+https://erratique.ch/repos/fmt.git" -bug-reports: "https://github.com/dbuenzli/fmt/issues" -tags: [ "string" "format" "pretty-print" "org:erratique" ] -license: "ISC" -depends: [ - "ocaml" {>= "4.05.0"} - "ocamlfind" {build} - "ocamlbuild" {build} - "topkg" {build & >= "0.9.0"} - # Can be removed once ocaml >= 4.07 - "seq" - "stdlib-shims" -] -depopts: [ "base-unix" "cmdliner" ] -conflicts: [ "cmdliner" {< "0.9.8"} ] -build: [[ - "ocaml" "pkg/pkg.ml" "build" - "--dev-pkg" "%{pinned}%" - "--with-base-unix" "%{base-unix:installed}%" - "--with-cmdliner" "%{cmdliner:installed}%" ]] - -synopsis: """OCaml Format pretty-printer combinators""" -description: """\ - -Fmt exposes combinators to devise `Format` pretty-printing functions. - -Fmt depends only on the OCaml standard library. The optional `Fmt_tty` -library that allows to setup formatters for terminal color output -depends on the Unix library. The optional `Fmt_cli` library that -provides command line support for Fmt depends on [`Cmdliner`][cmdliner]. - -Fmt is distributed under the ISC license. - -[cmdliner]: http://erratique.ch/software/cmdliner -""" -url { -archive: "https://erratique.ch/software/fmt/releases/fmt-0.8.8.tbz" -checksum: "473490fcfdf3ff0a8ccee226b873d4b2" -} diff --git a/esy.lock/opam/gmap.0.3.0/opam b/esy.lock/opam/gmap.0.3.0/opam deleted file mode 100644 index 29a684e..0000000 --- a/esy.lock/opam/gmap.0.3.0/opam +++ /dev/null @@ -1,36 +0,0 @@ -opam-version: "2.0" -maintainer: "Hannes Mehnert " -authors: "Hannes Mehnert " -license: "ISC" -homepage: "https://github.com/hannesm/gmap" -doc: "https://hannesm.github.io/gmap/doc" -bug-reports: "https://github.com/hannesm/gmap/issues" -depends: [ - "ocaml" {>= "4.04.2"} - "dune" - "alcotest" {with-test} - "fmt" {with-test} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/hannesm/gmap.git" -synopsis: "Heterogenous maps over a GADT" -description: """ -Gmap exposes the functor `Make` which takes a key type (a -[GADT](https://en.wikipedia.org/wiki/Generalized_algebraic_data_type) 'a key) -and outputs a type-safe Map where each 'a key is associated with a 'a value. -This removes the need for additional packing. It uses OCaml's stdlib -[Map](http://caml.inria.fr/pub/docs/manual-ocaml/libref/Map.html) data -structure. -""" -url { - src: - "https://github.com/hannesm/gmap/releases/download/0.3.0/gmap-0.3.0.tbz" - checksum: [ - "sha256=04dd9e6226ac8f8fb4ccb6021048702e34a482fb9c1d240d3852829529507c1c" - "sha512=71616981f5a15d6b2a47e18702083e52e81f6547076085b1489f676f50b0cc47c7c2c4fa19cb581e2878dc3d4f7133d0c50d8b51a8390be0e6e30318907d81d3" - ] -} diff --git a/esy.lock/opam/ipaddr-sexp.4.0.0/opam b/esy.lock/opam/ipaddr-sexp.4.0.0/opam deleted file mode 100644 index 2dbcd25..0000000 --- a/esy.lock/opam/ipaddr-sexp.4.0.0/opam +++ /dev/null @@ -1,35 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: ["David Sheets" "Anil Madhavapeddy" "Hugo Heuzard"] -synopsis: "A library for manipulation of IP address representations usnig sexp" -description: """ -Sexp convertions for ipaddr -""" - -license: "ISC" -tags: ["org:mirage" "org:xapi-project"] -homepage: "https://github.com/mirage/ocaml-ipaddr" -doc: "https://mirage.github.io/ocaml-ipaddr/" -bug-reports: "https://github.com/mirage/ocaml-ipaddr/issues" -depends: [ - "ocaml" {>= "4.04.0"} - "dune" {>="1.9.0"} - "ipaddr" {=version} - "ipaddr-cstruct" {with-test & =version} - "ounit" {with-test} - "ppx_sexp_conv" {>= "v0.9.0" & < "v0.14"} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/mirage/ocaml-ipaddr.git" -url { - src: - "https://github.com/mirage/ocaml-ipaddr/releases/download/v4.0.0/ipaddr-v4.0.0.tbz" - checksum: [ - "sha256=6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29" - "sha512=ca55a8cfa8b84c0a2f4e1fe7afb4c582066bbb562efb94169c0347e441ce076dc426d191772edb869eca6bd77f42f7141378181057ad8886da25ef915a9ee57f" - ] -} diff --git a/esy.lock/opam/ipaddr.4.0.0/opam b/esy.lock/opam/ipaddr.4.0.0/opam deleted file mode 100644 index d724296..0000000 --- a/esy.lock/opam/ipaddr.4.0.0/opam +++ /dev/null @@ -1,51 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: ["David Sheets" "Anil Madhavapeddy" "Hugo Heuzard"] -synopsis: "A library for manipulation of IP (and MAC) address representations" -description: """ -Features: - * Depends only on sexplib (conditionalization under consideration) - * oUnit-based tests - * IPv4 and IPv6 support - * IPv4 and IPv6 CIDR prefix support - * IPv4 and IPv6 [CIDR-scoped address](http://tools.ietf.org/html/rfc4291#section-2.3) support - * `Ipaddr.V4` and `Ipaddr.V4.Prefix` modules are `Map.OrderedType` - * `Ipaddr.V6` and `Ipaddr.V6.Prefix` modules are `Map.OrderedType` - * `Ipaddr` and `Ipaddr.Prefix` modules are `Map.OrderedType` - * `Ipaddr_unix` in findlib subpackage `ipaddr.unix` provides compatibility with the standard library `Unix` module - * `Ipaddr_top` in findlib subpackage `ipaddr.top` provides top-level pretty printers (requires compiler-libs default since OCaml 4.0) - * IP address scope classification - * IPv4-mapped addresses in IPv6 (::ffff:0:0/96) are an embedding of IPv4 - * MAC-48 (Ethernet) address support - * `Macaddr` is a `Map.OrderedType` - * All types have sexplib serializers/deserializers -""" - -license: "ISC" -tags: ["org:mirage" "org:xapi-project"] -homepage: "https://github.com/mirage/ocaml-ipaddr" -doc: "https://mirage.github.io/ocaml-ipaddr/" -bug-reports: "https://github.com/mirage/ocaml-ipaddr/issues" -depends: [ - "ocaml" {>= "4.04.0"} - "dune" {>="1.9.0"} - "macaddr" {=version} - "sexplib0" {< "v0.14"} - "domain-name" {>= "0.3.0"} - "ounit" {with-test} - "ppx_sexp_conv" {with-test & >= "v0.9.0" & < "v0.14"} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/mirage/ocaml-ipaddr.git" -url { - src: - "https://github.com/mirage/ocaml-ipaddr/releases/download/v4.0.0/ipaddr-v4.0.0.tbz" - checksum: [ - "sha256=6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29" - "sha512=ca55a8cfa8b84c0a2f4e1fe7afb4c582066bbb562efb94169c0347e441ce076dc426d191772edb869eca6bd77f42f7141378181057ad8886da25ef915a9ee57f" - ] -} diff --git a/esy.lock/opam/jbuilder.1.0+beta20.2/opam b/esy.lock/opam/jbuilder.1.0+beta20.2/opam deleted file mode 100644 index 2e411c9..0000000 --- a/esy.lock/opam/jbuilder.1.0+beta20.2/opam +++ /dev/null @@ -1,39 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/ocaml/dune" -bug-reports: "https://github.com/ocaml/dune/issues" -dev-repo: "git+https://github.com/ocaml/dune.git" -license: "Apache-2.0" -build: [ - ["ocaml" "configure.ml" "--libdir" lib] - ["ocaml" "bootstrap.ml"] - ["./boot.exe" "--subst"] {pinned} - ["./boot.exe" "-j" jobs] -] -synopsis: "Fast, portable and opinionated build system" -description: """ -jbuilder is a build system that was designed to simplify the release -of Jane Street packages. It reads metadata from "jbuild" files -following a very simple s-expression syntax. - -jbuilder is fast, it has very low-overhead and support parallel builds -on all platforms. It has no system dependencies, all you need to build -jbuilder and packages using jbuilder is OCaml. You don't need or make -or bash as long as the packages themselves don't use bash explicitely. - -jbuilder supports multi-package development by simply dropping multiple -repositories into the same directory. - -It also supports multi-context builds, such as building against -several opam roots/switches simultaneously. This helps maintaining -packages across several versions of OCaml and gives cross-compilation -for free.""" -depends: [ - "ocaml" {>= "4.02.3"} -] -url { - src: - "https://github.com/ocaml/dune/releases/download/1.0%2Bbeta20.2/jbuilder-1.0+beta20.2.tbz" - checksum: "md5=fbe8c3b1facb206cac3fb8932b5dd5d9" -} diff --git a/esy.lock/opam/jsonm.1.0.1/opam b/esy.lock/opam/jsonm.1.0.1/opam deleted file mode 100644 index 642c344..0000000 --- a/esy.lock/opam/jsonm.1.0.1/opam +++ /dev/null @@ -1,37 +0,0 @@ -opam-version: "2.0" -maintainer: "Daniel Bünzli " -authors: ["Daniel Bünzli "] -homepage: "http://erratique.ch/software/jsonm" -doc: "http://erratique.ch/software/jsonm/doc/Jsonm" -dev-repo: "git+http://erratique.ch/repos/jsonm.git" -bug-reports: "https://github.com/dbuenzli/jsonm/issues" -tags: [ "json" "codec" "org:erratique" ] -license: "ISC" -depends: [ - "ocaml" {>= "4.01.0"} - "ocamlfind" {build} - "ocamlbuild" {build} - "topkg" {build} - "uchar" - "uutf" {>= "1.0.0"} -] -build:[[ - "ocaml" "pkg/pkg.ml" "build" - "--pinned" "%{pinned}%" ]] -synopsis: "Non-blocking streaming JSON codec for OCaml" -description: """ -Jsonm is a non-blocking streaming codec to decode and encode the JSON -data format. It can process JSON text without blocking on IO and -without a complete in-memory representation of the data. - -The alternative "uncut" codec also processes whitespace and -(non-standard) JSON with JavaScript comments. - -Jsonm is made of a single module and depends on [Uutf][uutf]. It is distributed -under the ISC license. - -[uutf]: http://erratique.ch/software/uutf""" -url { - src: "http://erratique.ch/software/jsonm/releases/jsonm-1.0.1.tbz" - checksum: "md5=e2ca39eaefd55b8d155c4f1ec5885311" -} diff --git a/esy.lock/opam/junit.2.0.2/opam b/esy.lock/opam/junit.2.0.2/opam deleted file mode 100644 index 874cf38..0000000 --- a/esy.lock/opam/junit.2.0.2/opam +++ /dev/null @@ -1,32 +0,0 @@ -opam-version: "2.0" -maintainer: "Louis Roché " -authors: "Louis Roché " -homepage: "https://github.com/Khady/ocaml-junit" -bug-reports: "https://github.com/Khady/ocaml-junit/issues" -license: "LGPLv3+ with OCaml linking exception" -dev-repo: "git+https://github.com/Khady/ocaml-junit.git" -doc: "https://khady.github.io/ocaml-junit/" -tags: ["junit" "jenkins"] -depends: [ - "dune" {>= "1.0"} - "ptime" - "tyxml" {>= "4.0.0"} - "odoc" {with-doc & >= "1.1.1"} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} - ["dune" "build" "-p" name "-j" jobs] {with-doc} -] -name: "junit" -synopsis: "JUnit XML reports generation library" -description: "JUnit XML reports generation library" -url { - src: - "https://github.com/Khady/ocaml-junit/releases/download/2.0.2/junit-2.0.2.tbz" - checksum: [ - "sha256=fda941b653613a4a5731f9b3557364b12baa341daa13c01676c9eb8d64e96b01" - "sha512=5a9fa803c4861748bb8482fc51197420bf3cc3b9540989a489c4ffb65fdd02386aaa60437eae29182209dae0903b0e537c095249e19d395a451b8e8214f15f03" - ] -} diff --git a/esy.lock/opam/lambdasoup.0.7.0/opam b/esy.lock/opam/lambdasoup.0.7.0/opam deleted file mode 100644 index 31ea2a9..0000000 --- a/esy.lock/opam/lambdasoup.0.7.0/opam +++ /dev/null @@ -1,46 +0,0 @@ -opam-version: "2.0" - -synopsis: "Easy functional HTML scraping and manipulation with CSS selectors" - -version: "0.7.0" -license: "MIT" -homepage: "https://github.com/aantron/lambdasoup" -doc: "https://aantron.github.io/lambdasoup" -bug-reports: "https://github.com/aantron/lambdasoup/issues" - -authors: "Anton Bachin " -maintainer: "Anton Bachin " -dev-repo: "git+https://github.com/aantron/lambdasoup.git" - -depends: [ - # As a consequence of depending on Dune, Lambda Soup requires OCaml 4.02.3. - "dune" - "markup" {>= "0.7.1"} - "ocaml" {>= "4.02.0"} - - "bisect_ppx" {dev & >= "2.0.0"} - "ounit" {with-test} -] - -build: [ - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] - -description: """ -Lambda Soup is an HTML scraping library inspired by Python's Beautiful Soup. It -provides lazy traversals from HTML nodes to their parents, children, siblings, -etc., and to nodes matching CSS selectors. The traversals can be manipulated -using standard functional combinators such as fold, filter, and map. - -The DOM tree is mutable. You can use Lambda Soup for automatic HTML rewriting in -scripts. Lambda Soup rewrites its own ocamldoc page this way. - -A major goal of Lambda Soup is to be easy to use, including in interactive -sessions, and to have a minimal learning curve. It is a very simple library. -""" - -url { - src: "https://github.com/aantron/lambdasoup/archive/0.7.0.tar.gz" - checksum: "md5=2bb2c7d8a6ac4e12aa7dbdfcbaac0dd8" -} diff --git a/esy.lock/opam/logs.0.7.0/opam b/esy.lock/opam/logs.0.7.0/opam deleted file mode 100644 index e69bb7f..0000000 --- a/esy.lock/opam/logs.0.7.0/opam +++ /dev/null @@ -1,64 +0,0 @@ -opam-version: "2.0" -maintainer: "Daniel Bünzli " -authors: ["The logs programmers"] -homepage: "https://erratique.ch/software/logs" -doc: "https://erratique.ch/software/logs/doc" -dev-repo: "git+https://erratique.ch/repos/logs.git" -bug-reports: "https://github.com/dbuenzli/logs/issues" -tags: [ "log" "system" "org:erratique" ] -license: "ISC" -depends: [ - "ocaml" {>= "4.03.0"} - "ocamlfind" {build} - "ocamlbuild" {build} - "topkg" {build} - "mtime" {with-test} ] -depopts: [ - "js_of_ocaml" - "fmt" - "cmdliner" - "lwt" - "base-threads" -] -conflicts: [ - "js_of_ocaml" { < "3.3.0" } ] - -build: [[ - "ocaml" "pkg/pkg.ml" "build" - "--pinned" "%{pinned}%" - "--with-js_of_ocaml" "%{js_of_ocaml:installed}%" - "--with-fmt" "%{fmt:installed}%" - "--with-cmdliner" "%{cmdliner:installed}%" - "--with-lwt" "%{lwt:installed}%" - "--with-base-threads" "%{base-threads:installed}%" -]] - -synopsis: """Logging infrastructure for OCaml""" -description: """\ - -Logs provides a logging infrastructure for OCaml. Logging is performed -on sources whose reporting level can be set independently. Log message -report is decoupled from logging and is handled by a reporter. - -A few optional log reporters are distributed with the base library and -the API easily allows to implement your own. - -`Logs` has no dependencies. The optional `Logs_fmt` reporter on OCaml -formatters depends on [Fmt][fmt]. The optional `Logs_browser` -reporter that reports to the web browser console depends on -[js_of_ocaml][jsoo]. The optional `Logs_cli` library that provides -command line support for controlling Logs depends on -[`Cmdliner`][cmdliner]. The optional `Logs_lwt` library that provides -Lwt logging functions depends on [`Lwt`][lwt] - -Logs and its reporters are distributed under the ISC license. - -[fmt]: http://erratique.ch/software/fmt -[jsoo]: http://ocsigen.org/js_of_ocaml/ -[cmdliner]: http://erratique.ch/software/cmdliner -[lwt]: http://ocsigen.org/lwt/ -""" -url { -archive: "https://erratique.ch/software/logs/releases/logs-0.7.0.tbz" -checksum: "2bf021ca13331775e33cf34ab60246f7" -} diff --git a/esy.lock/opam/lwt.5.1.2/opam b/esy.lock/opam/lwt.5.1.2/opam deleted file mode 100644 index f9ef56a..0000000 --- a/esy.lock/opam/lwt.5.1.2/opam +++ /dev/null @@ -1,62 +0,0 @@ -opam-version: "2.0" - -synopsis: "Promises and event-driven I/O" - -version: "5.1.2" -license: "MIT" -homepage: "https://github.com/ocsigen/lwt" -doc: "https://ocsigen.org/lwt" -bug-reports: "https://github.com/ocsigen/lwt/issues" - -authors: [ - "Jérôme Vouillon" - "Jérémie Dimino" -] -maintainer: [ - "Anton Bachin " -] -dev-repo: "git+https://github.com/ocsigen/lwt.git" - -depends: [ - "cppo" {build & >= "1.1.0"} - "dune" {>= "1.7.0"} - "dune-configurator" - "mmap" {>= "1.1.0"} # mmap is needed as long as Lwt supports OCaml < 4.06.0. - "ocaml" {>= "4.02.0"} - "ocplib-endian" - "result" # result is needed as long as Lwt supports OCaml 4.02. - "seq" # seq is needed as long as Lwt supports OCaml < 4.07.0. - - "bisect_ppx" {dev & >= "1.3.0"} - "ocamlfind" {dev & >= "1.7.3-1"} -] - -depopts: [ - "base-threads" - "base-unix" - "conf-libev" -] - -conflicts: [ - "ocaml-variants" {= "4.02.1+BER"} -] - -build: [ - ["dune" "exec" "src/unix/config/discover.exe" "--root" "." "--" "--save" - "--use-libev" "%{conf-libev:installed}%"] - ["dune" "build" "-p" name "-j" jobs] -] - -description: "A promise is a value that may become determined in the future. - -Lwt provides typed, composable promises. Promises that are resolved by I/O are -resolved by Lwt in parallel. - -Meanwhile, OCaml code, including code creating and waiting on promises, runs in -a single thread by default. This reduces the need for locks or other -synchronization primitives. Code can be run in parallel on an opt-in basis." - -url { - src: "https://github.com/ocsigen/lwt/archive/5.1.2.tar.gz" - checksum: "md5=dc4005582a6ab32227f5ff90cb480dbe" -} diff --git a/esy.lock/opam/lwt_ppx.2.0.0/opam b/esy.lock/opam/lwt_ppx.2.0.0/opam deleted file mode 100644 index 77071eb..0000000 --- a/esy.lock/opam/lwt_ppx.2.0.0/opam +++ /dev/null @@ -1,34 +0,0 @@ -opam-version: "2.0" - -synopsis: "PPX syntax for Lwt, providing something similar to async/await from JavaScript" - -version: "2.0.0" -license: "MIT" -homepage: "https://github.com/ocsigen/lwt" -doc: "https://ocsigen.org/lwt/api/Ppx_lwt" -bug-reports: "https://github.com/ocsigen/lwt/issues" - -authors: [ - "Gabriel Radanne" -] -maintainer: [ - "Anton Bachin " -] -dev-repo: "git+https://github.com/ocsigen/lwt.git" - -depends: [ - "dune" {>= "1.1"} - "lwt" - "ocaml" {>= "4.02.0"} - "ocaml-migrate-parsetree" {>= "1.4.0"} - "ppx_tools_versioned" {>= "5.2.3"} -] - -build: [ - ["dune" "build" "-p" name "-j" jobs] -] - -url { - src: "https://github.com/ocsigen/lwt/archive/5.0.0.tar.gz" - checksum: "md5=a4ffc0e3aa692d2e7d800f4cf2dd3db0" -} diff --git a/esy.lock/opam/macaddr.4.0.0/opam b/esy.lock/opam/macaddr.4.0.0/opam deleted file mode 100644 index a94f9e0..0000000 --- a/esy.lock/opam/macaddr.4.0.0/opam +++ /dev/null @@ -1,40 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: ["David Sheets" "Anil Madhavapeddy" "Hugo Heuzard"] -synopsis: "A library for manipulation of MAC address representations" -license: "ISC" -tags: ["org:mirage" "org:xapi-project"] -homepage: "https://github.com/mirage/ocaml-ipaddr" -doc: "https://mirage.github.io/ocaml-ipaddr/" -bug-reports: "https://github.com/mirage/ocaml-ipaddr/issues" -depends: [ - "ocaml" {>= "4.04.0"} - "dune" {>="1.9.0"} - "ounit" {with-test} - "ppx_sexp_conv" {with-test & >= "v0.9.0" & < "v0.14"} -] -conflicts: [ "ipaddr" {< "3.0.0"} ] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/mirage/ocaml-ipaddr.git" -description: """ -A library for manipulation of MAC address representations. - -Features: - - * oUnit-based tests - * MAC-48 (Ethernet) address support - * `Macaddr` is a `Map.OrderedType` - * All types have sexplib serializers/deserializers optionally via the `Macaddr_sexp` library. - """ -url { - src: - "https://github.com/mirage/ocaml-ipaddr/releases/download/v4.0.0/ipaddr-v4.0.0.tbz" - checksum: [ - "sha256=6f4abf9c210b20ccddf4610691a87b8c870790d8f71d4a7edcfca9e21b59fc29" - "sha512=ca55a8cfa8b84c0a2f4e1fe7afb4c582066bbb562efb94169c0347e441ce076dc426d191772edb869eca6bd77f42f7141378181057ad8886da25ef915a9ee57f" - ] -} diff --git a/esy.lock/opam/magic-mime.1.1.2/opam b/esy.lock/opam/magic-mime.1.1.2/opam deleted file mode 100644 index 8e398fb..0000000 --- a/esy.lock/opam/magic-mime.1.1.2/opam +++ /dev/null @@ -1,41 +0,0 @@ -opam-version: "2.0" -name: "magic-mime" -synopsis: "Map filenames to common MIME types" -description: """ -This library contains a database of MIME types that maps filename extensions -into MIME types suitable for use in many Internet protocols such as HTTP or -e-mail. It is generated from the `mime.types` file found in Unix systems, but -has no dependency on a filesystem since it includes the contents of the -database as an ML datastructure. - -For example, here's how to lookup MIME types in the [utop] REPL: - - #require "magic-mime";; - Magic_mime.lookup "/foo/bar.txt";; - - : bytes = "text/plain" - Magic_mime.lookup "bar.css";; - - : bytes = "text/css" -""" -maintainer: "Anil Madhavapeddy " -authors: ["Anil Madhavapeddy" "Maxence Guesdon"] -license: "ISC" -homepage: "https://github.com/mirage/ocaml-magic-mime" -doc: "https://mirage.github.io/ocaml-magic-mime/" -bug-reports: "https://github.com/mirage/ocaml-magic-mime/issues" -dev-repo: "git+https://github.com/mirage/ocaml-magic-mime.git" -depends: [ - "ocaml" {>= "4.03.0"} - "dune" -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] -] -url { - src: - "https://github.com/mirage/ocaml-magic-mime/releases/download/v1.1.2/magic-mime-v1.1.2.tbz" - checksum: [ - "sha256=0c590bbc747531b56d392ee8f063d879df1e2026ba2dfa2d1bc98c9a9acb04eb" - "sha512=8264db78adc2c75b8adabc23c26ad34eab98383bd3a8f2068f2236ff3425d653c0238fbd7361e55a3d70d843413ef8671b6e97293074b4d3a1e300628d5292ab" - ] -} diff --git a/esy.lock/opam/markup.0.8.2/opam b/esy.lock/opam/markup.0.8.2/opam deleted file mode 100644 index a1b3a60..0000000 --- a/esy.lock/opam/markup.0.8.2/opam +++ /dev/null @@ -1,53 +0,0 @@ -opam-version: "2.0" - -synopsis: "Error-recovering functional HTML5 and XML parsers and writers" - -version: "0.8.2" -license: "MIT" -homepage: "https://github.com/aantron/markup.ml" -doc: "http://aantron.github.io/markup.ml" -bug-reports: "https://github.com/aantron/markup.ml/issues" - -authors: "Anton Bachin " -maintainer: "Anton Bachin " -dev-repo: "git+https://github.com/aantron/markup.ml.git" - -depends: [ - "dune" - "ocaml" {>= "4.02.0"} - "uchar" - "uutf" {>= "1.0.0"} - - "bisect_ppx" {dev & >= "2.0.0"} - "ounit" {dev} -] -# Markup.ml implicitly requires OCaml 4.02.3, as this is a contraint of Dune. - -build: [ - ["dune" "build" "-p" name "-j" jobs] -] - -description: """ -Markup.ml provides an HTML parser and an XML parser. The parsers are wrapped in -a simple interface: they are functions that transform byte streams to parsing -signal streams. Streams can be manipulated in various ways, such as processing -by fold, filter, and map, assembly into DOM tree structures, or serialization -back to HTML or XML. - -Both parsers are based on their respective standards. The HTML parser, in -particular, is based on the state machines defined in HTML5. - -The parsers are error-recovering by default, and accept fragments. This makes it -very easy to get a best-effort parse of some input. The parsers can, however, be -easily configured to be strict, and to accept only full documents. - -Apart from this, the parsers are streaming (do not build up a document in -memory), non-blocking (can be used with threading libraries), lazy (do not -consume input unless the signal stream is being read), and process the input in -a single pass. They automatically detect the character encoding of the input -stream, and convert everything to UTF-8.""" - -url { - src: "https://github.com/aantron/markup.ml/archive/0.8.2.tar.gz" - checksum: "md5=0fe6b3a04d941ca40a5efdd082f1183d" -} diff --git a/esy.lock/opam/menhir.20200211/opam b/esy.lock/opam/menhir.20200211/opam deleted file mode 100644 index f1f18fc..0000000 --- a/esy.lock/opam/menhir.20200211/opam +++ /dev/null @@ -1,27 +0,0 @@ -opam-version: "2.0" -maintainer: "francois.pottier@inria.fr" -authors: [ - "François Pottier " - "Yann Régis-Gianas " -] -homepage: "http://gitlab.inria.fr/fpottier/menhir" -dev-repo: "git+https://gitlab.inria.fr/fpottier/menhir.git" -bug-reports: "menhir@inria.fr" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.02.3"} - "dune" {>= "2.2.0"} - "menhirLib" {= version} - "menhirSdk" {= version} -] -synopsis: "An LR(1) parser generator" -url { - src: - "https://gitlab.inria.fr/fpottier/menhir/repository/20200211/archive.tar.gz" - checksum: [ - "md5=01577e5f15380c35bdaa8fd818204560" - "sha512=a686c4b047d5236c425afcd7f179964191268ff448b8d18510579d742a7256855049bc4fe568bb8f1b0d6cbfb758d95cd05e621e3410b75245bb799d623725d6" - ] -} diff --git a/esy.lock/opam/menhirLib.20200211/opam b/esy.lock/opam/menhirLib.20200211/opam deleted file mode 100644 index 28d3e42..0000000 --- a/esy.lock/opam/menhirLib.20200211/opam +++ /dev/null @@ -1,25 +0,0 @@ -opam-version: "2.0" -maintainer: "francois.pottier@inria.fr" -authors: [ - "François Pottier " - "Yann Régis-Gianas " -] -homepage: "http://gitlab.inria.fr/fpottier/menhir" -dev-repo: "git+https://gitlab.inria.fr/fpottier/menhir.git" -bug-reports: "menhir@inria.fr" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.02.3"} - "dune" {>= "2.0.0"} -] -synopsis: "Runtime support library for parsers generated by Menhir" -url { - src: - "https://gitlab.inria.fr/fpottier/menhir/repository/20200211/archive.tar.gz" - checksum: [ - "md5=01577e5f15380c35bdaa8fd818204560" - "sha512=a686c4b047d5236c425afcd7f179964191268ff448b8d18510579d742a7256855049bc4fe568bb8f1b0d6cbfb758d95cd05e621e3410b75245bb799d623725d6" - ] -} diff --git a/esy.lock/opam/menhirSdk.20200211/opam b/esy.lock/opam/menhirSdk.20200211/opam deleted file mode 100644 index 524045e..0000000 --- a/esy.lock/opam/menhirSdk.20200211/opam +++ /dev/null @@ -1,25 +0,0 @@ -opam-version: "2.0" -maintainer: "francois.pottier@inria.fr" -authors: [ - "François Pottier " - "Yann Régis-Gianas " -] -homepage: "http://gitlab.inria.fr/fpottier/menhir" -dev-repo: "git+https://gitlab.inria.fr/fpottier/menhir.git" -bug-reports: "menhir@inria.fr" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.02.3"} - "dune" {>= "2.0.0"} -] -synopsis: "Compile-time library for auxiliary tools related to Menhir" -url { - src: - "https://gitlab.inria.fr/fpottier/menhir/repository/20200211/archive.tar.gz" - checksum: [ - "md5=01577e5f15380c35bdaa8fd818204560" - "sha512=a686c4b047d5236c425afcd7f179964191268ff448b8d18510579d742a7256855049bc4fe568bb8f1b0d6cbfb758d95cd05e621e3410b75245bb799d623725d6" - ] -} diff --git a/esy.lock/opam/merlin-extend.0.5/opam b/esy.lock/opam/merlin-extend.0.5/opam deleted file mode 100644 index a3ae0d3..0000000 --- a/esy.lock/opam/merlin-extend.0.5/opam +++ /dev/null @@ -1,29 +0,0 @@ -opam-version: "2.0" -maintainer: "Frederic Bour " -authors: "Frederic Bour " -homepage: "https://github.com/let-def/merlin-extend" -bug-reports: "https://github.com/let-def/merlin-extend" -license: "MIT" -dev-repo: "git+https://github.com/let-def/merlin-extend.git" -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "dune" {>= "1.0"} - "cppo" {build} - "ocaml" {>= "4.02.3"} -] -synopsis: "A protocol to provide custom frontend to Merlin" -description: """ -This protocol allows to replace the OCaml frontend of Merlin. -It extends what used to be done with the `-pp' flag to handle a few more cases.""" -doc: "https://let-def.github.io/merlin-extend" -url { - src: - "https://github.com/let-def/merlin-extend/releases/download/v0.5/merlin-extend-v0.5.tbz" - checksum: [ - "sha256=ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227" - "sha512=55c5a3637337abb8ca8db679128a81ca8ccce567bc214d55b2e6444dc0e905b74c64d629bdea2457d0fe4be5306414feefcdbc4d4761fdafd59aa107550936b6" - ] -} diff --git a/esy.lock/opam/merlin.3.3.3/opam b/esy.lock/opam/merlin.3.3.3/opam deleted file mode 100644 index f0db8e9..0000000 --- a/esy.lock/opam/merlin.3.3.3/opam +++ /dev/null @@ -1,71 +0,0 @@ -opam-version: "2.0" -maintainer: "defree@gmail.com" -authors: "The Merlin team" -homepage: "https://github.com/ocaml/merlin" -bug-reports: "https://github.com/ocaml/merlin/issues" -dev-repo: "git+https://github.com/ocaml/merlin.git" -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -depends: [ - "ocaml" {>= "4.02.1" & < "4.10"} - "dune" {>= "1.8.0"} - "ocamlfind" {>= "1.5.2"} - "yojson" {>= "1.6.0"} - "mdx" {with-test & >= "1.3.0"} - "conf-jq" {with-test} -] -synopsis: - "Editor helper, provides completion, typing and source browsing in Vim and Emacs" -description: - "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." -post-messages: [ - "merlin installed. - -Quick setup for VIM -------------------- -Append this to your .vimrc to add merlin to vim's runtime-path: - let g:opamshare = substitute(system('opam config var share'),'\\n$','','''') - execute \"set rtp+=\" . g:opamshare . \"/merlin/vim\" - -Also run the following line in vim to index the documentation: - :execute \"helptags \" . g:opamshare . \"/merlin/vim/doc\" - -Quick setup for EMACS -------------------- -Add opam emacs directory to your load-path by appending this to your .emacs: - (let ((opam-share (ignore-errors (car (process-lines \"opam\" \"config\" \"var\" \"share\"))))) - (when (and opam-share (file-directory-p opam-share)) - ;; Register Merlin - (add-to-list 'load-path (expand-file-name \"emacs/site-lisp\" opam-share)) - (autoload 'merlin-mode \"merlin\" nil t nil) - ;; Automatically start it in OCaml buffers - (add-hook 'tuareg-mode-hook 'merlin-mode t) - (add-hook 'caml-mode-hook 'merlin-mode t) - ;; Use opam switch to lookup ocamlmerlin binary - (setq merlin-command 'opam))) - -Take a look at https://github.com/ocaml/merlin for more information - -Quick setup with opam-user-setup --------------------------------- - -Opam-user-setup support Merlin. - - $ opam user-setup install - -should take care of basic setup. -See https://github.com/OCamlPro/opam-user-setup -" - {success & !user-setup:installed} -] -url { - src: - "https://github.com/ocaml/merlin/releases/download/v3.3.3/merlin-v3.3.3.tbz" - checksum: [ - "sha256=72909ef47eea1f6fca13b4109a34dccf8fe3923a3c026f1ed1db9eb5ee9aae15" - "sha512=2a5f39d966be56c1322982effc05bc98fd5f66cd12f1f76953f8daa9eca74a58c92a186854f4e601e2f0bb038720691446e7591b4613982accded3e579fedb23" - ] -} diff --git a/esy.lock/opam/mirage-no-solo5.1/opam b/esy.lock/opam/mirage-no-solo5.1/opam deleted file mode 100644 index f0fe26c..0000000 --- a/esy.lock/opam/mirage-no-solo5.1/opam +++ /dev/null @@ -1,8 +0,0 @@ -opam-version: "2.0" -maintainer: "mirageos-devel@lists.xenproject.org" -authors: ["mirageos-devel@lists.xenproject.org"] -homepage: "https://mirage.io" -license: "BSD-2-Clause" -conflicts: [ "mirage-solo5" ] -synopsis: "Virtual package conflicting with mirage-solo5" -depends: ["ocaml"] diff --git a/esy.lock/opam/mirage-no-xen.1/opam b/esy.lock/opam/mirage-no-xen.1/opam deleted file mode 100644 index 39a9028..0000000 --- a/esy.lock/opam/mirage-no-xen.1/opam +++ /dev/null @@ -1,8 +0,0 @@ -opam-version: "2.0" -maintainer: "mirageos-devel@lists.xenproject.org" -authors: ["mirageos-devel@lists.xenproject.org"] -homepage: "https://mirage.io" -license: "BSD-2-Clause" -conflicts: [ "mirage-xen" ] -synopsis: "Virtual package conflicting with mirage-xen" -depends: ["ocaml"] diff --git a/esy.lock/opam/mmap.1.1.0/opam b/esy.lock/opam/mmap.1.1.0/opam deleted file mode 100644 index 52d8ff0..0000000 --- a/esy.lock/opam/mmap.1.1.0/opam +++ /dev/null @@ -1,24 +0,0 @@ -opam-version: "2.0" -maintainer: "jeremie@dimino.org" -authors: ["Jérémie Dimino " "Anton Bachin" ] -homepage: "https://github.com/mirage/mmap" -bug-reports: "https://github.com/mirage/mmap/issues" -doc: "https://mirage.github.io/mmap/" -dev-repo: "git+https://github.com/mirage/mmap.git" -license: "LGPL-2.1-only with OCaml-LGPL-linking-exception" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" - "dune" {>= "1.6"} -] -synopsis: "File mapping functionality" -description: """ -This project provides a Mmap.map_file functions for mapping files in memory. -""" -url { - src: - "https://github.com/mirage/mmap/releases/download/v1.1.0/mmap-v1.1.0.tbz" - checksum: "md5=8c5d5fbc537296dc525867535fb878ba" -} diff --git a/esy.lock/opam/nocrypto.0.5.4-2/files/0001-add-missing-runtime-dependencies-in-_tags.patch b/esy.lock/opam/nocrypto.0.5.4-2/files/0001-add-missing-runtime-dependencies-in-_tags.patch deleted file mode 100644 index 1b3b972..0000000 --- a/esy.lock/opam/nocrypto.0.5.4-2/files/0001-add-missing-runtime-dependencies-in-_tags.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 6f97531287a3e3ee749f2277248af28bdc85b8e4 Mon Sep 17 00:00:00 2001 -From: Gabriel Scherer -Date: Mon, 26 Mar 2018 16:09:16 +0200 -Subject: [PATCH 1/4] add missing runtime dependencies in _tags - -Binaries in , depend on ppx_sexp_conv's runtime -library within ppx_sexp_conv. - -The packed modules also depend on the package -ppx_sexp_conv: its presence at pack-creation time influences the -generated .cmi interface, see - - https://github.com/ocaml/opam-repository/pull/11628#issuecomment-375697444 - -Note: the package ppx_sexp_conv.runtime-lib would suffice, but it is -only available as such under recent ppx_sexp_conv versions, so its -explicit use would make the build description (needlessly) -incompatible with older ppx_sexp_conv versions. ---- - _tags | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/_tags b/_tags -index 6d4e7de..c2a6610 100644 ---- a/_tags -+++ b/_tags -@@ -7,6 +7,7 @@ true: package(bytes), package(cstruct) - : package(zarith), package(sexplib), package(ppx_sexp_conv) - and not : for-pack(Nocrypto) - : link_stubs(src/libnocrypto_stubs) -+: package(ppx_sexp_conv) - - : include - : package(unix), package(bytes) -@@ -19,7 +20,7 @@ true: package(bytes), package(cstruct) - - <**/*.c>: ccopt(--std=c99 -Wall -Wextra -O3) - --: use_nocrypto, package(zarith), package(cstruct.unix) --: use_nocrypto, package(zarith), package(oUnit) -+: use_nocrypto, package(zarith), package(ppx_sexp_conv) -+: use_nocrypto, package(zarith), package(ppx_sexp_conv), package(oUnit) - - : -traverse --- -2.18.0 - diff --git a/esy.lock/opam/nocrypto.0.5.4-2/files/0002-add-ppx_sexp_conv-as-a-runtime-dependency-in-the-pac.patch b/esy.lock/opam/nocrypto.0.5.4-2/files/0002-add-ppx_sexp_conv-as-a-runtime-dependency-in-the-pac.patch deleted file mode 100644 index e4d3439..0000000 --- a/esy.lock/opam/nocrypto.0.5.4-2/files/0002-add-ppx_sexp_conv-as-a-runtime-dependency-in-the-pac.patch +++ /dev/null @@ -1,39 +0,0 @@ -From dc799fd2a66c41ca7729201a5d038cd403ca1de6 Mon Sep 17 00:00:00 2001 -From: Gabriel Scherer -Date: Tue, 27 Mar 2018 12:00:23 +0200 -Subject: [PATCH 2/4] add ppx_sexp_conv as a runtime dependency in the - packaging metadata - ---- - opam | 2 +- - pkg/META | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/opam b/opam -index ad1dbc7..c35570b 100644 ---- a/opam -+++ b/opam -@@ -20,7 +20,7 @@ depends: [ - "topkg" {build} - "cpuid" {build} - "ocb-stubblr" {build} -- "ppx_sexp_conv" {build} -+ "ppx_sexp_conv" - "oUnit" {test} - "cstruct" - "zarith" -diff --git a/pkg/META b/pkg/META -index 242b2bb..a7929c7 100644 ---- a/pkg/META -+++ b/pkg/META -@@ -1,6 +1,6 @@ - version = "0.5.4" - description = "Simple crypto for the modern age" --requires = "cstruct zarith sexplib" -+requires = "cstruct zarith sexplib ppx_sexp_conv" - archive(byte) = "nocrypto.cma" - archive(native) = "nocrypto.cmxa" - plugin(byte) = "nocrypto.cma" --- -2.18.0 - diff --git a/esy.lock/opam/nocrypto.0.5.4-2/files/0003-Auto-detect-ppx_sexp_conv-runtime-library.patch b/esy.lock/opam/nocrypto.0.5.4-2/files/0003-Auto-detect-ppx_sexp_conv-runtime-library.patch deleted file mode 100644 index e2f03a1..0000000 --- a/esy.lock/opam/nocrypto.0.5.4-2/files/0003-Auto-detect-ppx_sexp_conv-runtime-library.patch +++ /dev/null @@ -1,146 +0,0 @@ -From ad9278021a65d423e30765e58110848adda4b13e Mon Sep 17 00:00:00 2001 -From: Jeremie Dimino -Date: Fri, 11 May 2018 15:44:47 +0200 -Subject: [PATCH 3/4] Auto-detect ppx_sexp_conv runtime library - ---- - myocamlbuild.ml | 25 ++++++++++++++++++++++--- - pkg/META | 43 ------------------------------------------- - pkg/META.in | 43 +++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 65 insertions(+), 46 deletions(-) - delete mode 100644 pkg/META - create mode 100644 pkg/META.in - -diff --git a/myocamlbuild.ml b/myocamlbuild.ml -index 2752315..7b29635 100644 ---- a/myocamlbuild.ml -+++ b/myocamlbuild.ml -@@ -1,5 +1,24 @@ - open Ocamlbuild_plugin - --let () = dispatch Ocb_stubblr.( -- init & ccopt ~tags:["accelerate"] "-DACCELERATE -msse2 -maes" --) -+let runtime_deps_of_ppx ppx = -+ (Findlib.query "ppx_sexp_conv").dependencies -+ |> List.filter_opt (fun { Findlib.name; _ } -> -+ if name = ppx || name = "ppx_deriving" then -+ None -+ else -+ Some name) -+ -+let () = dispatch (fun hook -> -+ Ocb_stubblr.( -+ init & ccopt ~tags:["accelerate"] "-DACCELERATE -msse2 -maes" -+ ) hook; -+ match hook with -+ | After_rules -> -+ let meta = "pkg/META" in -+ let meta_in = meta ^ ".in" in -+ rule meta ~dep:meta_in ~prod:meta (fun _ _ -> -+ let deps = String.concat " " (runtime_deps_of_ppx "ppx_sexp_conv") in -+ Echo([String.subst "PPX_SEXP_CONV_RUNTIME" deps -+ (Pathname.read meta_in)], -+ meta)) -+ | _ -> ()) -diff --git a/pkg/META b/pkg/META -deleted file mode 100644 -index a7929c7..0000000 ---- a/pkg/META -+++ /dev/null -@@ -1,43 +0,0 @@ --version = "0.5.4" --description = "Simple crypto for the modern age" --requires = "cstruct zarith sexplib ppx_sexp_conv" --archive(byte) = "nocrypto.cma" --archive(native) = "nocrypto.cmxa" --plugin(byte) = "nocrypto.cma" --plugin(native) = "nocrypto.cmxs" --xen_linkopts = "-lnocrypto_stubs+mirage-xen" --freestanding_linkopts = "-lnocrypto_stubs+mirage-freestanding" --exists_if = "nocrypto.cma" -- --package "unix" ( -- version = "0.5.4" -- description = "Simple crypto for the modern age" -- requires = "nocrypto unix bytes" -- archive(byte) = "nocrypto_unix.cma" -- archive(native) = "nocrypto_unix.cmxa" -- plugin(byte) = "nocrypto_unix.cma" -- plugin(native) = "nocrypto_unix.cmxs" -- exists_if = "nocrypto_unix.cma" --) -- --package "lwt" ( -- version = "0.5.4" -- description = "Simple crypto for the modern age" -- requires = "nocrypto nocrypto.unix lwt.unix cstruct.lwt" -- archive(byte) = "nocrypto_lwt.cma" -- archive(native) = "nocrypto_lwt.cmxa" -- plugin(byte) = "nocrypto_lwt.cma" -- plugin(native) = "nocrypto_lwt.cmxs" -- exists_if = "nocrypto_lwt.cma" --) -- --package "mirage" ( -- version = "0.5.4" -- description = "Simple crypto for the modern age" -- requires = "nocrypto lwt mirage-entropy" -- archive(byte) = "nocrypto_mirage.cma" -- archive(native) = "nocrypto_mirage.cmxa" -- plugin(byte) = "nocrypto_mirage.cma" -- plugin(native) = "nocrypto_mirage.cmxs" -- exists_if = "nocrypto_mirage.cma" --) -diff --git a/pkg/META.in b/pkg/META.in -new file mode 100644 -index 0000000..0b263d7 ---- /dev/null -+++ b/pkg/META.in -@@ -0,0 +1,43 @@ -+version = "0.5.4" -+description = "Simple crypto for the modern age" -+requires = "cstruct zarith sexplib PPX_SEXP_CONV_RUNTIME" -+archive(byte) = "nocrypto.cma" -+archive(native) = "nocrypto.cmxa" -+plugin(byte) = "nocrypto.cma" -+plugin(native) = "nocrypto.cmxs" -+xen_linkopts = "-lnocrypto_stubs+mirage-xen" -+freestanding_linkopts = "-lnocrypto_stubs+mirage-freestanding" -+exists_if = "nocrypto.cma" -+ -+package "unix" ( -+ version = "0.5.4" -+ description = "Simple crypto for the modern age" -+ requires = "nocrypto unix bytes" -+ archive(byte) = "nocrypto_unix.cma" -+ archive(native) = "nocrypto_unix.cmxa" -+ plugin(byte) = "nocrypto_unix.cma" -+ plugin(native) = "nocrypto_unix.cmxs" -+ exists_if = "nocrypto_unix.cma" -+) -+ -+package "lwt" ( -+ version = "0.5.4" -+ description = "Simple crypto for the modern age" -+ requires = "nocrypto nocrypto.unix lwt.unix cstruct.lwt" -+ archive(byte) = "nocrypto_lwt.cma" -+ archive(native) = "nocrypto_lwt.cmxa" -+ plugin(byte) = "nocrypto_lwt.cma" -+ plugin(native) = "nocrypto_lwt.cmxs" -+ exists_if = "nocrypto_lwt.cma" -+) -+ -+package "mirage" ( -+ version = "0.5.4" -+ description = "Simple crypto for the modern age" -+ requires = "nocrypto lwt mirage-entropy" -+ archive(byte) = "nocrypto_mirage.cma" -+ archive(native) = "nocrypto_mirage.cmxa" -+ plugin(byte) = "nocrypto_mirage.cma" -+ plugin(native) = "nocrypto_mirage.cmxs" -+ exists_if = "nocrypto_mirage.cma" -+) --- -2.18.0 - diff --git a/esy.lock/opam/nocrypto.0.5.4-2/files/0004-pack-package-workaround-ocamlbuild-272.patch b/esy.lock/opam/nocrypto.0.5.4-2/files/0004-pack-package-workaround-ocamlbuild-272.patch deleted file mode 100644 index 8bda0db..0000000 --- a/esy.lock/opam/nocrypto.0.5.4-2/files/0004-pack-package-workaround-ocamlbuild-272.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 063b3496340fe4c3544b532ec0d27797b7917bb4 Mon Sep 17 00:00:00 2001 -From: Gabriel Scherer -Date: Mon, 26 Mar 2018 16:07:45 +0200 -Subject: [PATCH 4/4] pack+package: workaround ocamlbuild#272 - -ocamlbuild should pass -package(...) flags to ocamlfind when building -a -pack-ed file, see - - https://github.com/ocaml/opam-repository/pull/11628#issuecomment-375697444 ---- - myocamlbuild.ml | 8 ++++++++ - 1 file changed, 8 insertions(+) - -diff --git a/myocamlbuild.ml b/myocamlbuild.ml -index 7b29635..7a5cdb6 100644 ---- a/myocamlbuild.ml -+++ b/myocamlbuild.ml -@@ -8,9 +8,17 @@ let runtime_deps_of_ppx ppx = - else - Some name) - -+let ocamlfind_and_pack = function -+ | After_rules -> -+ if !Options.use_ocamlfind then -+ pflag ["ocaml"; "pack"] "package" -+ (fun pkg -> S [A "-package"; A pkg]); -+ | _ -> () -+ - let () = dispatch (fun hook -> - Ocb_stubblr.( - init & ccopt ~tags:["accelerate"] "-DACCELERATE -msse2 -maes" -+ & ocamlfind_and_pack - ) hook; - match hook with - | After_rules -> --- -2.18.0 - diff --git a/esy.lock/opam/nocrypto.0.5.4-2/files/0005-use-modern-cstruct-findlib.patch b/esy.lock/opam/nocrypto.0.5.4-2/files/0005-use-modern-cstruct-findlib.patch deleted file mode 100644 index 406df1c..0000000 --- a/esy.lock/opam/nocrypto.0.5.4-2/files/0005-use-modern-cstruct-findlib.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 063b3496340fe4c3544b532ec0d27797b7917bb4 Mon Sep 17 00:00:00 2001 -From: Anil Madhavapeddy -Date: Tue, 12 Mar 2019 09:07:13 +0000 -Subject: [PATCH 5/5] use modern cstruct findlib - -see https://discuss.ocaml.org/t/psa-cstruct-3-4-0-removes-old-ocamlfind-subpackage-aliases/3275 - ---- a/_tags.orig 2019-03-12 09:03:58.000000000 +0000 -+++ b/_tags 2019-03-12 09:04:12.000000000 +0000 -@@ -13,7 +13,7 @@ - : package(unix), package(bytes) - - : include --: package(lwt.unix), package(cstruct.lwt) -+: package(lwt.unix), package(cstruct-lwt) - - : include - : package(lwt), package(mirage-entropy) ---- a/pkg/META.in.orig 2019-03-12 09:03:19.000000000 +0000 -+++ b/pkg/META.in 2019-03-12 09:03:33.000000000 +0000 -@@ -23,7 +23,7 @@ - package "lwt" ( - version = "0.5.4" - description = "Simple crypto for the modern age" -- requires = "nocrypto nocrypto.unix lwt.unix cstruct.lwt" -+ requires = "nocrypto nocrypto.unix lwt.unix cstruct-lwt" - archive(byte) = "nocrypto_lwt.cma" - archive(native) = "nocrypto_lwt.cmxa" - plugin(byte) = "nocrypto_lwt.cma" --- -2.18.0 - diff --git a/esy.lock/opam/nocrypto.0.5.4-2/files/0006-explicit-dependency-on-sexplib.patch b/esy.lock/opam/nocrypto.0.5.4-2/files/0006-explicit-dependency-on-sexplib.patch deleted file mode 100644 index 80c8075..0000000 --- a/esy.lock/opam/nocrypto.0.5.4-2/files/0006-explicit-dependency-on-sexplib.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 063b3496340fe4c3544b532ec0d27797b7917bb4 Mon Sep 17 00:00:00 2001 -From: Anil Madhavapeddy -Date: Tue, 26 Mar 2019 20:07:13 +0000 -Subject: [PATCH 6/6] explicitly depend on sexplib - -Need to explicitly depend on sexplib rather than hope -it is a transitive dependency of cstruct. This lets -cstruct.4.0.0 work which makes sexplib optional. - ---- a/_tags.orig 2019-03-26 20:33:33.000000000 +0000 -+++ b/_tags 2019-03-26 20:33:42.000000000 +0000 -@@ -1,7 +1,7 @@ - true: color(always) - true: bin_annot, safe_string - true: warn(A-4-29-33-40-41-42-43-34-44-48) --true: package(bytes), package(cstruct) -+true: package(bytes), package(sexplib), package(cstruct) - - : include - : package(zarith), package(sexplib), package(ppx_sexp_conv) - --- -2.18.0 - diff --git a/esy.lock/opam/nocrypto.0.5.4-2/files/0007-mirage-entropy.patch b/esy.lock/opam/nocrypto.0.5.4-2/files/0007-mirage-entropy.patch deleted file mode 100644 index 559c063..0000000 --- a/esy.lock/opam/nocrypto.0.5.4-2/files/0007-mirage-entropy.patch +++ /dev/null @@ -1,58 +0,0 @@ -From: Hannes Mehnert -Subject: [PATCH 1/1] compile mirage-entropy sublibrary if mirage-entropy is installed - -Previously the compilation depended on mirage-xen or ocaml-freestanding being -present, but _tags show the dependency is actually mirage-entropy. - ---- a/opam 2019-11-02 13:38:17.202429000 +0100 -+++ b/opam 2019-11-02 13:39:19.173535000 +0100 -@@ -12,6 +12,7 @@ - - build: ["ocaml" "pkg/pkg.ml" "build" "--pinned" "%{pinned}%" "--tests" "false" - "--with-lwt" "%{lwt:installed}%" -+ "--with-mirage" "%{mirage-entropy:installed}%" - "--xen" "%{mirage-xen:installed}%" - "--freestanding" "%{ocaml-freestanding:installed}%"] - -@@ -26,11 +27,11 @@ - "cstruct" - "zarith" - "sexplib" -- ("mirage-no-xen" | ("mirage-xen" & "mirage-entropy" & "zarith-xen")) -- ("mirage-no-solo5" | ("mirage-solo5" & "mirage-entropy" & "zarith-freestanding")) -+ ("mirage-no-xen" | ("mirage-xen" & "zarith-xen")) -+ ("mirage-no-solo5" | ("mirage-solo5" & "zarith-freestanding")) - ] - --depopts: [ "lwt" ] -+depopts: [ "lwt" "mirage-entropy" ] - conflicts: [ - "topkg" {<"0.8.0"} - "ocb-stubblr" {<"0.1.0"} ---- a/pkg/pkg.ml 2017-02-01 00:43:04.000000000 +0100 -+++ b/pkg/pkg.ml 2019-11-02 13:37:30.295780000 +0100 -@@ -11,6 +11,7 @@ - - let unix = Conf.with_pkg ~default:true "unix" - let lwt = Conf.with_pkg ~default:false "lwt" -+let mirage_entropy = Conf.with_pkg ~default:false "mirage" - let xen = Conf.(key "xen" bool ~absent:false - ~doc:"Build Mirage/Xen support.") - let fs = Conf.(key "freestanding" bool ~absent:false -@@ -39,12 +40,14 @@ - let unix = Conf.value c unix in - let lwt = Conf.value c lwt && unix - and xen = Conf.value c xen -- and fs = Conf.value c fs in -+ and fs = Conf.value c fs -+ and mirage_entropy = Conf.value c mirage_entropy -+ in - Ok [ Pkg.clib "src/libnocrypto_stubs.clib"; - Pkg.mllib "src/nocrypto.mllib"; - Pkg.mllib ~cond:unix "unix/nocrypto_unix.mllib"; - Pkg.mllib ~cond:lwt "lwt/nocrypto_lwt.mllib"; -- Pkg.mllib ~cond:(xen||fs) "mirage/nocrypto_mirage.mllib"; -+ Pkg.mllib ~cond:mirage_entropy "mirage/nocrypto_mirage.mllib"; - Pkg.test "tests/testrunner"; - Pkg.test ~run:false "bench/speed"; - mirage ~xen ~fs "src/libnocrypto_stubs.clib"; ] diff --git a/esy.lock/opam/nocrypto.0.5.4-2/opam b/esy.lock/opam/nocrypto.0.5.4-2/opam deleted file mode 100644 index 227df02..0000000 --- a/esy.lock/opam/nocrypto.0.5.4-2/opam +++ /dev/null @@ -1,95 +0,0 @@ -opam-version: "2.0" -homepage: "https://github.com/mirleft/ocaml-nocrypto" -dev-repo: "git+https://github.com/mirleft/ocaml-nocrypto.git" -bug-reports: "https://github.com/mirleft/ocaml-nocrypto/issues" -doc: "https://mirleft.github.io/ocaml-nocrypto/doc" -authors: ["David Kaloper "] -maintainer: "David Kaloper " -license: "ISC" -tags: [ "org:mirage" ] -build: ["ocaml" "pkg/pkg.ml" "build" "--pinned" "%{pinned}%" "--tests" "false" - "--jobs" "1" - "--with-lwt" "%{lwt:installed}%" - "--with-mirage" "%{mirage-entropy:installed}%" - "--xen" "%{mirage-xen:installed}%" - "--freestanding" "%{mirage-solo5:installed}%"] - -depends: [ - "ocaml" {>= "4.02.0"} - "ocamlfind" {build} - "ocamlbuild" {build} - "topkg" {build} - "cpuid" {build} - "ocb-stubblr" {build} - "ppx_deriving" - "ppx_sexp_conv" {>= "113.33.01" & != "v0.11.0" & < "v0.14"} - "ounit" {with-test} - "cstruct" {>= "3.0.0"} - "cstruct-lwt" - "zarith" - "lwt" - "sexplib" {< "v0.14"} - "mirage-no-xen" | ("mirage-xen" & "zarith-xen") - "mirage-no-solo5" | ("mirage-solo5" & "zarith-freestanding") -] -depopts: [ "mirage-entropy" ] -conflicts: [ - "topkg" {<"0.9.1"} - "ocb-stubblr" {<"0.1.0"} - "mirage-xen" {<"2.2.0"} - "sexplib" {="v0.9.0"} - "ocaml" {= "4.08.0"} -] - -patches: [ - "0001-add-missing-runtime-dependencies-in-_tags.patch" - "0002-add-ppx_sexp_conv-as-a-runtime-dependency-in-the-pac.patch" - "0003-Auto-detect-ppx_sexp_conv-runtime-library.patch" - "0004-pack-package-workaround-ocamlbuild-272.patch" - "0005-use-modern-cstruct-findlib.patch" - "0006-explicit-dependency-on-sexplib.patch" - "0007-mirage-entropy.patch" -] -synopsis: "Simpler crypto" -description: """ -nocrypto is a small cryptographic library that puts emphasis on the applicative -style and ease of use. It includes basic ciphers (AES, 3DES, RC4), hashes (MD5, -SHA1, SHA2), public-key primitives (RSA, DSA, DH) and a strong RNG (Fortuna). - -RSA timing attacks are countered by blinding. AES timing attacks are avoided by -delegating to AES-NI.""" -extra-files: [ - [ - "0007-mirage-entropy.patch" - "md5=bb3368e3fd64857a6d05e1a3e61f08cf" - ] - [ - "0006-explicit-dependency-on-sexplib.patch" - "md5=7f552e18ba304eb4e1e19d66d19b7888" - ] - [ - "0005-use-modern-cstruct-findlib.patch" - "md5=4d4aab890f0ca9327d83548c32d64efc" - ] - [ - "0004-pack-package-workaround-ocamlbuild-272.patch" - "md5=94615e4a8d5976e9e75c3b031d3484f1" - ] - [ - "0003-Auto-detect-ppx_sexp_conv-runtime-library.patch" - "md5=871b3f904cf87527b7390993d5598884" - ] - [ - "0002-add-ppx_sexp_conv-as-a-runtime-dependency-in-the-pac.patch" - "md5=06962f4f2f5b4c3f1e39293b3d3528f2" - ] - [ - "0001-add-missing-runtime-dependencies-in-_tags.patch" - "md5=ae679a096e14c0a0ecb881bc7432cc2a" - ] -] -url { - src: - "https://github.com/mirleft/ocaml-nocrypto/releases/download/v0.5.4/nocrypto-0.5.4.tbz" - checksum: "md5=c331a7a4d2a563d1d5ed581aeb849011" -} diff --git a/esy.lock/opam/num.1.3/files/installation-warning.patch b/esy.lock/opam/num.1.3/files/installation-warning.patch deleted file mode 100644 index 88ef9b6..0000000 --- a/esy.lock/opam/num.1.3/files/installation-warning.patch +++ /dev/null @@ -1,59 +0,0 @@ -From db8d748b2cad0adc2698e9fcf28727083a711bae Mon Sep 17 00:00:00 2001 -From: David Allsopp -Date: Wed, 24 Jan 2018 16:01:56 +0000 -Subject: [PATCH] Warn about installations broken by previous faulty package - ---- - Makefile | 33 +++++++++++++++++++++++++++++++++ - 1 file changed, 33 insertions(+) - -diff --git a/Makefile b/Makefile -index b40e588..d4dcd70 100644 ---- a/Makefile -+++ b/Makefile -@@ -14,9 +14,42 @@ install: - $(MAKE) -C src install - $(MAKE) -C toplevel install - -+OCAMLFIND_DIR:=$(dir $(shell command -v ocamlfind 2>/dev/null)) -+OCAMLC_DIR:=$(dir $(shell command -v ocamlc 2>/dev/null)) -+NUM_INSTALLED:=$(shell ocamlfind query num 2>/dev/null) -+ -+ifeq ($(NUM_INSTALLED),) -+# The num findlib package is not already present - wohoo! -+OUR_FAULT=no -+else -+ifeq ($(OCAMLFIND_DIR),$(OCAMLC_DIR)) -+# The num findlib package is present, but ocamlc and ocamlfind are in the -+# same place, which means that either we're looking at a system-installed -+# ocamlfind (which isn't supported), or the user has done something else -+# nefarious and doesn't deserve our sympathy (or, at least, our potentially -+# unhelpful advice) -+OUR_FAULT=no -+else -+# The num findlib package package is present, and ocamlc and ocamlfind reside -+# in different directories, which means that we're almost certainly looking at -+# a system switch which has been damaged by a previous num package installation -+# on an OS which didn't protect the system lib directory. -+OUR_FAULT=probably -+endif -+endif -+ - findlib-install: -+ifeq ($(OUR_FAULT),no) - $(MAKE) -C src findlib-install - $(MAKE) -C toplevel install -+else -+ @echo "\033[0;31m[ERROR]\033[m It appears that the num library was previously installed to your system" -+ @echo " compiler's lib directory, probably by a faulty opam package." -+ @echo " You will need to remove arith_flags.*, arith_status.*, big_int.*," -+ @echo " int_misc.*, nat.*, num.*, ratio.*, nums.*, libnums.* and" -+ @echo " stublibs/dllnums.* from $(shell ocamlc -where)." -+ @false -+endif - - uninstall: - $(MAKE) -C src uninstall --- -2.14.1 - diff --git a/esy.lock/opam/num.1.3/opam b/esy.lock/opam/num.1.3/opam deleted file mode 100644 index 412d737..0000000 --- a/esy.lock/opam/num.1.3/opam +++ /dev/null @@ -1,34 +0,0 @@ -opam-version: "2.0" -maintainer: "Xavier Leroy " -authors: [ - "Valérie Ménissier-Morain" - "Pierre Weis" - "Xavier Leroy" -] -license: "LGPL-2.1-only with OCaml-LGPL-linking-exception" -homepage: "https://github.com/ocaml/num/" -bug-reports: "https://github.com/ocaml/num/issues" -dev-repo: "git+https://github.com/ocaml/num.git" -build: [ - [make] -] -install: [ - make - "install" {!ocaml:preinstalled} - "findlib-install" {ocaml:preinstalled} -] -depends: [ - "ocaml" {>= "4.06.0"} - "ocamlfind" {build & >= "1.7.3"} -] -conflicts: [ "base-num" ] -patches: [ "installation-warning.patch" ] -synopsis: - "The legacy Num library for arbitrary-precision integer and rational arithmetic" -extra-files: [ - ["installation-warning.patch" "md5=93c92bf6da6bae09d068da42b1bbaaac"] -] -url { - src: "https://github.com/ocaml/num/archive/v1.3.tar.gz" - checksum: "md5=f074e12325e84ebc883b37e5db10403d" -} diff --git a/esy.lock/opam/ocaml-compiler-libs.v0.12.1/opam b/esy.lock/opam/ocaml-compiler-libs.v0.12.1/opam deleted file mode 100644 index 66f2549..0000000 --- a/esy.lock/opam/ocaml-compiler-libs.v0.12.1/opam +++ /dev/null @@ -1,23 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/ocaml-compiler-libs" -bug-reports: "https://github.com/janestreet/ocaml-compiler-libs/issues" -dev-repo: "git+https://github.com/janestreet/ocaml-compiler-libs.git" -license: "Apache-2.0" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.04.1"} - "dune" {>= "1.5.1"} -] -synopsis: "OCaml compiler libraries repackaged" -description: """ -This packages exposes the OCaml compiler libraries repackages under -the toplevel names Ocaml_common, Ocaml_bytecomp, Ocaml_optcomp, ...""" -url { - src: - "https://github.com/janestreet/ocaml-compiler-libs/archive/v0.12.1.tar.gz" - checksum: "md5=2f929af7c764a3f681a5671f271210c4" -} diff --git a/esy.lock/opam/ocaml-migrate-parsetree.1.6.0/opam b/esy.lock/opam/ocaml-migrate-parsetree.1.6.0/opam deleted file mode 100644 index 2437975..0000000 --- a/esy.lock/opam/ocaml-migrate-parsetree.1.6.0/opam +++ /dev/null @@ -1,37 +0,0 @@ -opam-version: "2.0" -maintainer: "frederic.bour@lakaban.net" -authors: [ - "Frédéric Bour " - "Jérémie Dimino " -] -license: "LGPL-2.1 with OCaml linking exception" -homepage: "https://github.com/ocaml-ppx/ocaml-migrate-parsetree" -bug-reports: "https://github.com/ocaml-ppx/ocaml-migrate-parsetree/issues" -dev-repo: "git+https://github.com/ocaml-ppx/ocaml-migrate-parsetree.git" -doc: "https://ocaml-ppx.github.io/ocaml-migrate-parsetree/" -tags: [ "syntax" "org:ocamllabs" ] -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "result" - "ppx_derivers" - "dune" {>= "1.9.0"} - "ocaml" {>= "4.02.3"} -] -synopsis: "Convert OCaml parsetrees between different versions" -description: """ -Convert OCaml parsetrees between different versions - -This library converts parsetrees, outcometree and ast mappers between -different OCaml versions. High-level functions help making PPX -rewriters independent of a compiler version. -""" -url { - src: - "https://github.com/ocaml-ppx/ocaml-migrate-parsetree/releases/download/v1.6.0/ocaml-migrate-parsetree-v1.6.0.tbz" - checksum: [ - "sha256=9b018e7d25114ce17fc0b82b7cd7c927b84ebb6b043aa987fa7731c2484de33f" - "sha512=e03a5fe44ecf43683c764a7285a65bfa80639c09badf422661723bc3483d6d799c47c1ead34c2caa289a37e1b4b46d809c8cc56537d5c76e6004849d2d8a305f" - ] -} diff --git a/esy.lock/opam/ocamlbuild.0.14.0/opam b/esy.lock/opam/ocamlbuild.0.14.0/opam deleted file mode 100644 index 8deabee..0000000 --- a/esy.lock/opam/ocamlbuild.0.14.0/opam +++ /dev/null @@ -1,36 +0,0 @@ -opam-version: "2.0" -maintainer: "Gabriel Scherer " -authors: ["Nicolas Pouillard" "Berke Durak"] -homepage: "https://github.com/ocaml/ocamlbuild/" -bug-reports: "https://github.com/ocaml/ocamlbuild/issues" -license: "LGPL-2.1-only with OCaml-LGPL-linking-exception" -doc: "https://github.com/ocaml/ocamlbuild/blob/master/manual/manual.adoc" -dev-repo: "git+https://github.com/ocaml/ocamlbuild.git" -build: [ - [ - make - "-f" - "configure.make" - "all" - "OCAMLBUILD_PREFIX=%{prefix}%" - "OCAMLBUILD_BINDIR=%{bin}%" - "OCAMLBUILD_LIBDIR=%{lib}%" - "OCAMLBUILD_MANDIR=%{man}%" - "OCAML_NATIVE=%{ocaml:native}%" - "OCAML_NATIVE_TOOLS=%{ocaml:native}%" - ] - [make "check-if-preinstalled" "all" "opam-install"] -] -conflicts: [ - "base-ocamlbuild" - "ocamlfind" {< "1.6.2"} -] -synopsis: - "OCamlbuild is a build system with builtin rules to easily build most OCaml projects." -depends: [ - "ocaml" {>= "4.03"} -] -url { - src: "https://github.com/ocaml/ocamlbuild/archive/0.14.0.tar.gz" - checksum: "sha256=87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78" -} diff --git a/esy.lock/opam/ocamlfind.1.8.1/files/ocaml-stub b/esy.lock/opam/ocamlfind.1.8.1/files/ocaml-stub deleted file mode 100644 index e5ad990..0000000 --- a/esy.lock/opam/ocamlfind.1.8.1/files/ocaml-stub +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -BINDIR=$(dirname "$(command -v ocamlc)") -"$BINDIR/ocaml" -I "$OCAML_TOPLEVEL_PATH" "$@" diff --git a/esy.lock/opam/ocamlfind.1.8.1/files/ocamlfind.install b/esy.lock/opam/ocamlfind.1.8.1/files/ocamlfind.install deleted file mode 100644 index 295c625..0000000 --- a/esy.lock/opam/ocamlfind.1.8.1/files/ocamlfind.install +++ /dev/null @@ -1,6 +0,0 @@ -bin: [ - "src/findlib/ocamlfind" {"ocamlfind"} - "?src/findlib/ocamlfind_opt" {"ocamlfind"} - "?tools/safe_camlp4" -] -toplevel: ["src/findlib/topfind"] diff --git a/esy.lock/opam/ocamlfind.1.8.1/opam b/esy.lock/opam/ocamlfind.1.8.1/opam deleted file mode 100644 index d757d66..0000000 --- a/esy.lock/opam/ocamlfind.1.8.1/opam +++ /dev/null @@ -1,50 +0,0 @@ -opam-version: "2.0" -synopsis: "A library manager for OCaml" -maintainer: "Thomas Gazagnaire " -authors: "Gerd Stolpmann " -homepage: "http://projects.camlcity.org/projects/findlib.html" -bug-reports: "https://gitlab.camlcity.org/gerd/lib-findlib/issues" -dev-repo: "git+https://gitlab.camlcity.org/gerd/lib-findlib.git" -description: """ -Findlib is a library manager for OCaml. It provides a convention how -to store libraries, and a file format ("META") to describe the -properties of libraries. There is also a tool (ocamlfind) for -interpreting the META files, so that it is very easy to use libraries -in programs and scripts. -""" -build: [ - [ - "./configure" - "-bindir" - bin - "-sitelib" - lib - "-mandir" - man - "-config" - "%{lib}%/findlib.conf" - "-no-custom" - "-no-camlp4" {!ocaml:preinstalled & ocaml:version >= "4.02.0"} - "-no-topfind" {ocaml:preinstalled} - ] - [make "all"] - [make "opt"] {ocaml:native} -] -install: [ - [make "install"] - ["install" "-m" "0755" "ocaml-stub" "%{bin}%/ocaml"] {ocaml:preinstalled} -] -depends: [ - "ocaml" {>= "4.00.0"} - "conf-m4" {build} -] -extra-files: [ - ["ocamlfind.install" "md5=06f2c282ab52d93aa6adeeadd82a2543"] - ["ocaml-stub" "md5=181f259c9e0bad9ef523e7d4abfdf87a"] -] -url { - src: "http://download.camlcity.org/download/findlib-1.8.1.tar.gz" - checksum: "md5=18ca650982c15536616dea0e422cbd8c" - mirrors: "http://download2.camlcity.org/download/findlib-1.8.1.tar.gz" -} -depopts: ["graphics"] diff --git a/esy.lock/opam/ocb-stubblr.0.1.1-1/files/custom-cclib.patch b/esy.lock/opam/ocb-stubblr.0.1.1-1/files/custom-cclib.patch deleted file mode 100644 index e78b0df..0000000 --- a/esy.lock/opam/ocb-stubblr.0.1.1-1/files/custom-cclib.patch +++ /dev/null @@ -1,22 +0,0 @@ -From d51b3f3a49f159469e00d23524db915f19bb0127 Mon Sep 17 00:00:00 2001 -From: Hannes Mehnert -Date: Tue, 3 Oct 2017 13:55:16 +0100 -Subject: [PATCH] bytecode / custom needs -cclib as well - ---- - src/ocb_stubblr.ml | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/ocb_stubblr.ml b/src/ocb_stubblr.ml -index b68c37a..a0ee035 100644 ---- a/src/ocb_stubblr.ml -+++ b/src/ocb_stubblr.ml -@@ -160,7 +160,7 @@ let link_flag () = - S [A switch; A ("-l"^name)] - and dep flag = Pathname.([remove_extension flag -.- "a"]) in - pflag ["link"; "ocaml"; "library"; "byte"] tag (libarg "-dllib"); -- pflag ["link"; "ocaml"; "library"; "native"] tag (libarg "-cclib"); -+ pflag ["link"; "ocaml"; "library"] tag (libarg "-cclib"); - pdep ["link"; "ocaml"] tag dep; - pdep ["compile"; "ocaml"] tag dep - (* XXX sneak in '-I' for compile;ocaml;program ?? *) diff --git a/esy.lock/opam/ocb-stubblr.0.1.1-1/files/use-OPAM_SWITCH_PREFIX.patch b/esy.lock/opam/ocb-stubblr.0.1.1-1/files/use-OPAM_SWITCH_PREFIX.patch deleted file mode 100644 index 67ffc9f..0000000 --- a/esy.lock/opam/ocb-stubblr.0.1.1-1/files/use-OPAM_SWITCH_PREFIX.patch +++ /dev/null @@ -1,33 +0,0 @@ -From f1c9340f3ab973ad1e8dcc4b7065bbe6cfaa028f Mon Sep 17 00:00:00 2001 -From: David Allsopp -Date: Sun, 1 Jul 2018 09:54:32 +0100 -Subject: [PATCH] Use OPAM_SWITCH_PREFIX before opam config var prefix - -opam 2's sandbox doesn't expose the mount point for the opam root. - -Signed-off-by: David Allsopp ---- - src/ocb_stubblr.ml | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/src/ocb_stubblr.ml b/src/ocb_stubblr.ml -index b68c37a..2cc5332 100644 ---- a/src/ocb_stubblr.ml -+++ b/src/ocb_stubblr.ml -@@ -31,11 +31,15 @@ module Pkg_config = struct - - (* XXX Would be nice to move pkg-config results to a build artefact. *) - -- let opam_prefix = -+ let opam_prefix_cmd = - let cmd = "opam config var prefix" in - lazy ( try run_and_read cmd with Failure _ -> - error_msgf "error running opam") - -+ let opam_prefix = -+ lazy (try Sys.getenv "OPAM_SWITCH_PREFIX" -+ with Not_found -> Lazy.force opam_prefix_cmd) -+ - let var = "PKG_CONFIG_PATH" - - let path () = diff --git a/esy.lock/opam/ocb-stubblr.0.1.1-1/opam b/esy.lock/opam/ocb-stubblr.0.1.1-1/opam deleted file mode 100644 index fd2ad94..0000000 --- a/esy.lock/opam/ocb-stubblr.0.1.1-1/opam +++ /dev/null @@ -1,56 +0,0 @@ -opam-version: "2.0" -maintainer: "David Kaloper Meršinjak " -authors: ["David Kaloper Meršinjak "] -homepage: "https://github.com/pqwy/ocb-stubblr" -doc: "https://pqwy.github.io/ocb-stubblr/doc" -license: "ISC" -dev-repo: "git+https://github.com/pqwy/ocb-stubblr.git" -bug-reports: "https://github.com/pqwy/ocb-stubblr/issues" -tags: ["ocamlbuild"] -depends: [ - "ocaml" {>= "4.01.0"} - "ocamlfind" {build} - "ocamlbuild" {>= "0.9.3" | < "0.9.0"} - "topkg" {>= "0.8.1"} - "astring" -] -build: [ "ocaml" "pkg/pkg.ml" "build" "--pinned" "%{pinned}%" "--tests" "false" ] - -patches: [ - "custom-cclib.patch" - "use-OPAM_SWITCH_PREFIX.patch" -] - -synopsis: "OCamlbuild plugin for C stubs" -description: """ -Do you get excited by C stubs? Do they sometimes make you swoon, and even faint, -and in the end no `cmxa`s get properly linked -- not to mention correct -multi-lib support? - -Do you wish that the things that excite you the most, would excite you just a -little less? Then ocb-stubblr is just the library for you. - -ocb-stubblr is about ten lines of code that you need to repeat over, over, over -and over again if you are using `ocamlbuild` to build OCaml projects that -contain C stubs -- now with 100% more lib! - -It does what everyone wants to do with `.clib` files in their project -directories. It can also clone the `.clib` and arrange for multiple compilations -with different sets of discovered `cflags`. - -ocb-stubblr is distributed under the ISC license.""" -url { - src: - "https://github.com/pqwy/ocb-stubblr/releases/download/v0.1.1/ocb-stubblr-0.1.1.tbz" - checksum: "md5=607720dd18ca51e40645b42df5c1273e" -} -extra-files: [ - [ - "custom-cclib.patch" - "md5=d479b52a50d53dd79da2d6eea2a9a9e3" - ] - [ - "use-OPAM_SWITCH_PREFIX.patch" - "md5=a7271bb1f862bd3da4ffd9caa87ca76f" - ] -] \ No newline at end of file diff --git a/esy.lock/opam/ocplib-endian.1.0/opam b/esy.lock/opam/ocplib-endian.1.0/opam deleted file mode 100644 index d468f3e..0000000 --- a/esy.lock/opam/ocplib-endian.1.0/opam +++ /dev/null @@ -1,33 +0,0 @@ -opam-version: "2.0" -authors: "Pierre Chambart" -maintainer: "pierre.chambart@ocamlpro.com" -homepage: "https://github.com/OCamlPro/ocplib-endian" -build: [ - ["ocaml" "setup.ml" "-configure" "--disable-debug" "--prefix" prefix] - ["ocaml" "setup.ml" "-build"] -] -install: [ - ["ocaml" "setup.ml" "-install"] -] -remove: ["ocamlfind" "remove" "ocplib-endian"] -depends: [ - "ocaml" - "base-bytes" - "ocamlfind" - "cppo" {>= "1.1.0"} - "ocamlbuild" {build} -] -dev-repo: "git+https://github.com/OCamlPro/ocplib-endian.git" -bug-reports: "https://github.com/OCamlPro/ocplib-endian/issues" -synopsis: - "Optimised functions to read and write int16/32/64 from strings and bigarrays, based on new primitives added in version 4.01." -description: """ -The library implements three modules: -* [EndianString](https://github.com/OCamlPro/ocplib-endian/blob/master/src/endianString.cppo.mli) works directly on strings, and provides submodules BigEndian and LittleEndian, with their unsafe counter-parts; -* [EndianBytes](https://github.com/OCamlPro/ocplib-endian/blob/master/src/endianBytes.cppo.mli) works directly on bytes, and provides submodules BigEndian and LittleEndian, with their unsafe counter-parts; -* [EndianBigstring](https://github.com/OCamlPro/ocplib-endian/blob/master/src/endianBigstring.cppo.mli) works on bigstrings (Bigarrays of chars), and provides submodules BigEndian and LittleEndian, with their unsafe counter-parts;""" -flags: light-uninstall -url { - src: "https://github.com/OCamlPro/ocplib-endian/archive/1.0.tar.gz" - checksum: "md5=74b45ba33e189283170a748c2a3ed477" -} diff --git a/esy.lock/opam/parsexp.v0.13.0/opam b/esy.lock/opam/parsexp.v0.13.0/opam deleted file mode 100644 index 323c089..0000000 --- a/esy.lock/opam/parsexp.v0.13.0/opam +++ /dev/null @@ -1,43 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/parsexp" -bug-reports: "https://github.com/janestreet/parsexp/issues" -dev-repo: "git+https://github.com/janestreet/parsexp.git" -doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/parsexp/index.html" -license: "MIT" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.04.2"} - "base" {>= "v0.13" & < "v0.14"} - "sexplib0" {>= "v0.13" & < "v0.14"} - "dune" {>= "1.5.1"} -] -synopsis: "S-expression parsing library" -description: " -This library provides generic parsers for parsing S-expressions from -strings or other medium. - -The library is focused on performances but still provide full generic -parsers that can be used with strings, bigstrings, lexing buffers, -character streams or any other sources effortlessly. - -It provides three different class of parsers: -- the normal parsers, producing [Sexp.t] or [Sexp.t list] values -- the parsers with positions, building compact position sequences so - that one can recover original positions in order to report properly - located errors at little cost -- the Concrete Syntax Tree parsers, produce values of type - [Parsexp.Cst.t] which record the concrete layout of the s-expression - syntax, including comments - -This library is portable and doesn't provide IO functions. To read -s-expressions from files or other external sources, you should use -parsexp_io. -" -url { - src: "https://ocaml.janestreet.com/ocaml-core/v0.13/files/parsexp-v0.13.0.tar.gz" - checksum: "md5=08d2f6eca6a1eda735bf030d2581da43" -} diff --git a/esy.lock/opam/ppx_cstruct.5.1.1/opam b/esy.lock/opam/ppx_cstruct.5.1.1/opam deleted file mode 100644 index 370cf2b..0000000 --- a/esy.lock/opam/ppx_cstruct.5.1.1/opam +++ /dev/null @@ -1,44 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: ["Anil Madhavapeddy" "Richard Mortier" "Thomas Gazagnaire" - "Pierre Chambart" "David Kaloper" "Jeremy Yallop" "David Scott" - "Mindy Preston" "Thomas Leonard" "Etienne Millon" ] -homepage: "https://github.com/mirage/ocaml-cstruct" -license: "ISC" -dev-repo: "git+https://github.com/mirage/ocaml-cstruct.git" -bug-reports: "https://github.com/mirage/ocaml-cstruct/issues" -doc: "https://mirage.github.io/ocaml-cstruct/" - -tags: [ "org:mirage" "org:ocamllabs" ] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -depends: [ - "ocaml" {>= "4.03.0"} - "dune" - "cstruct" {=version} - "ounit" {with-test} - "ppx_tools_versioned" {>= "5.0.1"} - "ocaml-migrate-parsetree" - "ppx_sexp_conv" {with-test} - "sexplib" {>="v0.9.0"} - "cstruct-sexp" {with-test} - "cppo" {with-test} - "cstruct-unix" {with-test & =version} - "stdlib-shims" -] -synopsis: "Access C-like structures directly from OCaml" -description: """ -Cstruct is a library and syntax extension to make it easier to access C-like -structures directly from OCaml. It supports both reading and writing to these -structures, and they are accessed via the `Bigarray` module.""" -url { - src: - "https://github.com/mirage/ocaml-cstruct/releases/download/v5.1.1/cstruct-v5.1.1.tbz" - checksum: [ - "sha256=55d1f42cb85f7872fee499c5ed382aea17b06d55d1709e071d1ba85c7a09fef3" - "sha512=c3aa9a5a9125a1d022506a76fd7cdf32b21edcdc9df1202d8a9f382d02a28a33fea9a958f79e9302907ade1fce3f166b620c320aed6486e3efcc9a7464379cab" - ] -} diff --git a/esy.lock/opam/ppx_derivers.1.2.1/opam b/esy.lock/opam/ppx_derivers.1.2.1/opam deleted file mode 100644 index 3d10814..0000000 --- a/esy.lock/opam/ppx_derivers.1.2.1/opam +++ /dev/null @@ -1,23 +0,0 @@ -opam-version: "2.0" -maintainer: "jeremie@dimino.org" -authors: ["Jérémie Dimino"] -license: "BSD-3-Clause" -homepage: "https://github.com/ocaml-ppx/ppx_derivers" -bug-reports: "https://github.com/ocaml-ppx/ppx_derivers/issues" -dev-repo: "git://github.com/ocaml-ppx/ppx_derivers.git" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" - "dune" -] -synopsis: "Shared [@@deriving] plugin registry" -description: """ -Ppx_derivers is a tiny package whose sole purpose is to allow -ppx_deriving and ppx_type_conv to inter-operate gracefully when linked -as part of the same ocaml-migrate-parsetree driver.""" -url { - src: "https://github.com/ocaml-ppx/ppx_derivers/archive/1.2.1.tar.gz" - checksum: "md5=5dc2bf130c1db3c731fe0fffc5648b41" -} diff --git a/esy.lock/opam/ppx_deriving.4.4.1/opam b/esy.lock/opam/ppx_deriving.4.4.1/opam deleted file mode 100644 index 1fd0d53..0000000 --- a/esy.lock/opam/ppx_deriving.4.4.1/opam +++ /dev/null @@ -1,36 +0,0 @@ -opam-version: "2.0" -maintainer: "whitequark " -authors: [ "whitequark " ] -license: "MIT" -homepage: "https://github.com/ocaml-ppx/ppx_deriving" -doc: "https://ocaml-ppx.github.io/ppx_deriving/" -bug-reports: "https://github.com/ocaml-ppx/ppx_deriving/issues" -dev-repo: "git+https://github.com/ocaml-ppx/ppx_deriving.git" -tags: [ "syntax" ] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test & ocaml:version >= "4.03"} - ["dune" "build" "@doc" "-p" name "-j" jobs] {with-doc} -] -depends: [ - "dune" {>= "1.6.3"} - "cppo" {build} - "ppxfind" {build} - "ocaml-migrate-parsetree" - "ppx_derivers" - "ppx_tools" {>= "4.02.3"} - "result" - "ounit" {with-test} - "ocaml" {>= "4.02.2" & < "4.11.0"} -] -synopsis: "Type-driven code generation for OCaml >=4.02.2" -description: """ -ppx_deriving provides common infrastructure for generating -code based on type definitions, and a set of useful plugins -for common tasks. -""" -url { - src: "https://github.com/ocaml-ppx/ppx_deriving/archive/v4.4.1.tar.gz" - checksum: "sha256=27bc57774724fc4f48775f2011375a5ee1439570204abbf6607761c472757e2f" -} diff --git a/esy.lock/opam/ppx_deriving_yojson.3.5.1/opam b/esy.lock/opam/ppx_deriving_yojson.3.5.1/opam deleted file mode 100644 index a4a4a22..0000000 --- a/esy.lock/opam/ppx_deriving_yojson.3.5.1/opam +++ /dev/null @@ -1,35 +0,0 @@ -opam-version: "2.0" -maintainer: "whitequark " -authors: [ "whitequark " ] -license: "MIT" -homepage: "https://github.com/whitequark/ppx_deriving_yojson" -bug-reports: "https://github.com/whitequark/ppx_deriving_yojson/issues" -dev-repo: "git://github.com/whitequark/ppx_deriving_yojson.git" -tags: [ "syntax" "json" ] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name] {with-test} -] -depends: [ - "ocaml" {>= "4.04.0" & < "4.10.0"} - "yojson" {>= "1.6.0" & < "2.0.0"} - "result" - "ppx_deriving" {>= "4.0" & < "5.0"} - "ppx_tools" {build} - "ppxfind" {build} - "dune" {>= "1.2"} - "cppo" {build} - "ounit" {with-test & >= "2.0.0"} -] -conflicts: [ - "ppx_deriving" {= "4.2"} -] -synopsis: "JSON codec generator for OCaml" -description: """ -ppx_deriving_yojson is a ppx_deriving plugin that provides -a JSON codec generator.""" -url { - src: "https://github.com/ocaml-ppx/ppx_deriving_yojson/archive/v3.5.1.tar.gz" - checksum: "sha256=aefe9c673f2f0ee2beb9edcca5a4e332a9fe9266c81bc554b8df5cd375568994" -} diff --git a/esy.lock/opam/ppx_fields_conv.v0.13.0/opam b/esy.lock/opam/ppx_fields_conv.v0.13.0/opam deleted file mode 100644 index 717e301..0000000 --- a/esy.lock/opam/ppx_fields_conv.v0.13.0/opam +++ /dev/null @@ -1,26 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/ppx_fields_conv" -bug-reports: "https://github.com/janestreet/ppx_fields_conv/issues" -dev-repo: "git+https://github.com/janestreet/ppx_fields_conv.git" -doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_fields_conv/index.html" -license: "MIT" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.04.2"} - "base" {>= "v0.13" & < "v0.14"} - "fieldslib" {>= "v0.13" & < "v0.14"} - "dune" {>= "1.5.1"} - "ppxlib" {>= "0.9.0"} -] -synopsis: "Generation of accessor and iteration functions for ocaml records" -description: " -Part of the Jane Street's PPX rewriters collection. -" -url { - src: "https://ocaml.janestreet.com/ocaml-core/v0.13/files/ppx_fields_conv-v0.13.0.tar.gz" - checksum: "md5=02c84db8ce53d6da9316bacae27d8d15" -} diff --git a/esy.lock/opam/ppx_let.v0.13.0/opam b/esy.lock/opam/ppx_let.v0.13.0/opam deleted file mode 100644 index 34433ac..0000000 --- a/esy.lock/opam/ppx_let.v0.13.0/opam +++ /dev/null @@ -1,25 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/ppx_let" -bug-reports: "https://github.com/janestreet/ppx_let/issues" -dev-repo: "git+https://github.com/janestreet/ppx_let.git" -doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_let/index.html" -license: "MIT" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.04.2"} - "base" {>= "v0.13" & < "v0.14"} - "dune" {>= "1.5.1"} - "ppxlib" {>= "0.9.0"} -] -synopsis: "Monadic let-bindings" -description: " -Part of the Jane Street's PPX rewriters collection. -" -url { - src: "https://ocaml.janestreet.com/ocaml-core/v0.13/files/ppx_let-v0.13.0.tar.gz" - checksum: "md5=8b5fab936fffa4b02f786ef18ab0c877" -} diff --git a/esy.lock/opam/ppx_sexp_conv.v0.13.0/opam b/esy.lock/opam/ppx_sexp_conv.v0.13.0/opam deleted file mode 100644 index d40a584..0000000 --- a/esy.lock/opam/ppx_sexp_conv.v0.13.0/opam +++ /dev/null @@ -1,26 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/ppx_sexp_conv" -bug-reports: "https://github.com/janestreet/ppx_sexp_conv/issues" -dev-repo: "git+https://github.com/janestreet/ppx_sexp_conv.git" -doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/ppx_sexp_conv/index.html" -license: "MIT" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.04.2"} - "base" {>= "v0.13" & < "v0.14"} - "sexplib0" {>= "v0.13" & < "v0.14"} - "dune" {>= "1.5.1"} - "ppxlib" {>= "0.9.0"} -] -synopsis: "[@@deriving] plugin to generate S-expression conversion functions" -description: " -Part of the Jane Street's PPX rewriters collection. -" -url { - src: "https://ocaml.janestreet.com/ocaml-core/v0.13/files/ppx_sexp_conv-v0.13.0.tar.gz" - checksum: "md5=acb33a38721f4a16f71add6afaa315da" -} diff --git a/esy.lock/opam/ppx_tools.6.0+4.08.0/opam b/esy.lock/opam/ppx_tools.6.0+4.08.0/opam deleted file mode 100644 index 0f2f696..0000000 --- a/esy.lock/opam/ppx_tools.6.0+4.08.0/opam +++ /dev/null @@ -1,21 +0,0 @@ -opam-version: "2.0" -synopsis: "Tools for authors of ppx rewriters and other syntactic tools" -maintainer: "alain.frisch@lexifi.com" -authors: "Alain Frisch " -license: "MIT" -tags: [ "syntax" ] -homepage: "https://github.com/ocaml-ppx/ppx_tools" -bug-reports: "https://github.com/ocaml-ppx/ppx_tools/issues" -dev-repo: "git://github.com/ocaml-ppx/ppx_tools.git" -build: ["dune" "build" "-p" name "-j" jobs] -depends: [ - "ocaml" {>= "4.08.0" & < "4.10"} - "dune" {>= "1.6"} -] -url { - src: "https://github.com/ocaml-ppx/ppx_tools/archive/6.0+4.08.0.tar.gz" - checksum: [ - "md5=801e82103fee7ce1e4a59ab670601952" - "sha512=b576398a0dfad76ea9874cc18550bb44078a7e8f8dc0c169a0441f75f3881e458c42316c96d816c6e81d5ef219fac3aa539471f006b46088c9b943ed8af8b947" - ] -} diff --git a/esy.lock/opam/ppx_tools_versioned.5.2.3/opam b/esy.lock/opam/ppx_tools_versioned.5.2.3/opam deleted file mode 100644 index dbf79a1..0000000 --- a/esy.lock/opam/ppx_tools_versioned.5.2.3/opam +++ /dev/null @@ -1,30 +0,0 @@ -opam-version: "2.0" -maintainer: "frederic.bour@lakaban.net" -authors: [ - "Frédéric Bour " - "Alain Frisch " -] -license: "MIT" -homepage: "https://github.com/ocaml-ppx/ppx_tools_versioned" -bug-reports: "https://github.com/ocaml-ppx/ppx_tools_versioned/issues" -dev-repo: "git://github.com/ocaml-ppx/ppx_tools_versioned.git" -tags: [ "syntax" ] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -depends: [ - "ocaml" {>= "4.02.0"} - "dune" {>= "1.0"} - "ocaml-migrate-parsetree" {>= "1.4.0"} -] -synopsis: "A variant of ppx_tools based on ocaml-migrate-parsetree" -url { - src: - "https://github.com/ocaml-ppx/ppx_tools_versioned/archive/5.2.3.tar.gz" - checksum: [ - "md5=b1455e5a4a1bcd9ddbfcf712ccbd4262" - "sha512=af20aa0031b9c638537bcdb52c75de95f316ae8fd455a38672a60da5c7c6895cca9dbecd5d56a88c3c40979c6a673a047d986b5b41e1e84b528b7df5d905b9b1" - ] -} diff --git a/esy.lock/opam/ppxfind.1.4/opam b/esy.lock/opam/ppxfind.1.4/opam deleted file mode 100644 index 29ed9c6..0000000 --- a/esy.lock/opam/ppxfind.1.4/opam +++ /dev/null @@ -1,41 +0,0 @@ -opam-version: "2.0" -synopsis: "Tool combining ocamlfind and ppx" -description: """ -Ppxfind is a small command line tool that among other things allows -to use old style ppx rewriters with jbuilder. -""" -maintainer: ["Jérémie Dimino "] -authors: ["Jérémie Dimino "] -license: "BSD3" -homepage: "https://github.com/diml/ppxfind" -doc: "https://diml.github.io/ppxfind/" -bug-reports: "https://github.com/diml/ppxfind/issues" -depends: [ - "dune" {>= "2.0"} - "ocaml-migrate-parsetree" {>= "1.6.0"} - "ocamlfind" - "ocaml" {>= "4.02.3"} -] -build: [ - ["dune" "subst"] {pinned} - [ - "dune" - "build" - "-p" - name - "-j" - jobs - "@install" - "@runtest" {with-test} - "@doc" {with-doc} - ] -] -dev-repo: "git+https://github.com/diml/ppxfind.git" -url { - src: - "https://github.com/diml/ppxfind/releases/download/1.4/ppxfind-1.4.tbz" - checksum: [ - "sha256=98291c69f04f7f7b7cdad1b5d786c70fc595559d4663cc04cb711ac132db4971" - "sha512=f80b0ee09fb536aa9f154da80d06a1b68ba3b10605fb7338bd6449beb5c8d00e983bf66b4a63e12659ae1410fea56d0a2c4cfd43584616438504628035bcb981" - ] -} diff --git a/esy.lock/opam/ppxlib.0.12.0/opam b/esy.lock/opam/ppxlib.0.12.0/opam deleted file mode 100644 index 6a41efc..0000000 --- a/esy.lock/opam/ppxlib.0.12.0/opam +++ /dev/null @@ -1,46 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/ocaml-ppx/ppxlib" -bug-reports: "https://github.com/ocaml-ppx/ppxlib/issues" -dev-repo: "git+https://github.com/ocaml-ppx/ppxlib.git" -doc: "https://ocaml-ppx.github.io/ppxlib/" -license: "MIT" -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] -] -run-test: [ - ["dune" "runtest" "-p" name "-j" jobs] { ocaml:version >= "4.06" & ocaml:version < "4.08" } -] -depends: [ - "ocaml" {>= "4.04.1" & < "4.11.0"} - "base" {>= "v0.11.0"} - "dune" {>= "1.11"} - "ocaml-compiler-libs" {>= "v0.11.0"} - "ocaml-migrate-parsetree" {>= "1.3.1"} - "ppx_derivers" {>= "1.0"} - "stdio" {>= "v0.11.0"} - "ocamlfind" {with-test} - "cinaps" {with-test & >= "v0.12.1"} -] -synopsis: "Base library and tools for ppx rewriters" -description: """ -A comprehensive toolbox for ppx development. It features: -- a OCaml AST / parser / pretty-printer snapshot,to create a full - frontend independent of the version of OCaml; -- a library for library for ppx rewriters in general, and type-driven - code generators in particular; -- a feature-full driver for OCaml AST transformers; -- a quotation mechanism allowing to write values representing the - OCaml AST in the OCaml syntax; -- a generator of open recursion classes from type definitions. -""" -url { - src: - "https://github.com/ocaml-ppx/ppxlib/archive/0.12.0.tar.gz" - checksum: [ - "sha256=6b562c9b3b9350777318729921f890850b385c469db60769aafd9371998a2c42" - "sha512=2372a7a53d857389978e617c95183289547d53caa5e83a7d867cab347b114b719667bd09eaf2e2334085ef92691a99b42871f6410ffb2977b0b8724014c80a70" - ] -} diff --git a/esy.lock/opam/ptime.0.8.5/opam b/esy.lock/opam/ptime.0.8.5/opam deleted file mode 100644 index ed7c8d9..0000000 --- a/esy.lock/opam/ptime.0.8.5/opam +++ /dev/null @@ -1,49 +0,0 @@ -opam-version: "2.0" -maintainer: "Daniel Bünzli " -authors: ["The ptime programmers"] -homepage: "https://erratique.ch/software/ptime" -doc: "https://erratique.ch/software/ptime/doc" -dev-repo: "git+http://erratique.ch/repos/ptime.git" -bug-reports: "https://github.com/dbuenzli/ptime/issues" -tags: [ "time" "posix" "system" "org:erratique" ] -license: "ISC" -depends: [ - "ocaml" {>= "4.01.0"} - "ocamlfind" {build} - "ocamlbuild" {build} - "topkg" {build} - "result" -] -depopts: [ "js_of_ocaml" ] -conflicts: [ "js_of_ocaml" { < "3.3.0" } ] -build:[[ - "ocaml" "pkg/pkg.ml" "build" - "--pinned" "%{pinned}%" - "--with-js_of_ocaml" "%{js_of_ocaml:installed}%" ]] - -synopsis: """POSIX time for OCaml""" -description: """\ - -Ptime has platform independent POSIX time support in pure OCaml. It -provides a type to represent a well-defined range of POSIX timestamps -with picosecond precision, conversion with date-time values, -conversion with [RFC 3339 timestamps][rfc3339] and pretty printing to a -human-readable, locale-independent representation. - -The additional Ptime_clock library provides access to a system POSIX -clock and to the system's current time zone offset. - -Ptime is not a calendar library. - -Ptime depends on the `result` compatibility package. Ptime_clock -depends on your system library. Ptime_clock's optional JavaScript -support depends on [js_of_ocaml][jsoo]. Ptime and its libraries are -distributed under the ISC license. - -[rfc3339]: http://tools.ietf.org/html/rfc3339 -[jsoo]: http://ocsigen.org/js_of_ocaml/ -""" -url { -archive: "https://erratique.ch/software/ptime/releases/ptime-0.8.5.tbz" -checksum: "4d48055d623ecf2db792439b3e96a520" -} diff --git a/esy.lock/opam/re.1.9.0/opam b/esy.lock/opam/re.1.9.0/opam deleted file mode 100644 index f798754..0000000 --- a/esy.lock/opam/re.1.9.0/opam +++ /dev/null @@ -1,42 +0,0 @@ -opam-version: "2.0" - -maintainer: "rudi.grinberg@gmail.com" -authors: [ - "Jerome Vouillon" - "Thomas Gazagnaire" - "Anil Madhavapeddy" - "Rudi Grinberg" - "Gabriel Radanne" -] -license: "LGPL-2.0-only with OCaml-LGPL-linking-exception" -homepage: "https://github.com/ocaml/ocaml-re" -bug-reports: "https://github.com/ocaml/ocaml-re/issues" -dev-repo: "git+https://github.com/ocaml/ocaml-re.git" - -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] - -depends: [ - "ocaml" {>= "4.02"} - "dune" - "ounit" {with-test} - "seq" -] - -synopsis: "RE is a regular expression library for OCaml" -description: """ -Pure OCaml regular expressions with: -* Perl-style regular expressions (module Re.Perl) -* Posix extended regular expressions (module Re.Posix) -* Emacs-style regular expressions (module Re.Emacs) -* Shell-style file globbing (module Re.Glob) -* Compatibility layer for OCaml's built-in Str module (module Re.Str) -""" -url { - src: - "https://github.com/ocaml/ocaml-re/releases/download/1.9.0/re-1.9.0.tbz" - checksum: "md5=bddaed4f386a22cace7850c9c7dac296" -} diff --git a/esy.lock/opam/result.1.5/opam b/esy.lock/opam/result.1.5/opam deleted file mode 100644 index 671af04..0000000 --- a/esy.lock/opam/result.1.5/opam +++ /dev/null @@ -1,22 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/result" -dev-repo: "git+https://github.com/janestreet/result.git" -bug-reports: "https://github.com/janestreet/result/issues" -license: "BSD-3-Clause" -build: [["dune" "build" "-p" name "-j" jobs]] -depends: [ - "ocaml" - "dune" {>= "1.0"} -] -synopsis: "Compatibility Result module" -description: """ -Projects that want to use the new result type defined in OCaml >= 4.03 -while staying compatible with older version of OCaml should use the -Result module defined in this library.""" -url { - src: - "https://github.com/janestreet/result/releases/download/1.5/result-1.5.tbz" - checksum: "md5=1b82dec78849680b49ae9a8a365b831b" -} diff --git a/esy.lock/opam/rresult.0.6.0/opam b/esy.lock/opam/rresult.0.6.0/opam deleted file mode 100644 index 961ddcd..0000000 --- a/esy.lock/opam/rresult.0.6.0/opam +++ /dev/null @@ -1,35 +0,0 @@ -opam-version: "2.0" -maintainer: "Daniel Bünzli " -authors: ["Daniel Bünzli "] -homepage: "http://erratique.ch/software/rresult" -doc: "http://erratique.ch/software/rresult" -dev-repo: "git+http://erratique.ch/repos/rresult.git" -bug-reports: "https://github.com/dbuenzli/rresult/issues" -tags: [ "result" "error" "declarative" "org:erratique" ] -license: "ISC" -depends: [ - "ocaml" {>= "4.01.0"} - "ocamlfind" {build} - "ocamlbuild" {build} - "topkg" {build} - "result" -] -build:[[ - "ocaml" "pkg/pkg.ml" "build" - "--pinned" "%{pinned}%" ]] - -synopsis: """Result value combinators for OCaml""" -description: """\ - -Rresult is an OCaml module for handling computation results and errors -in an explicit and declarative manner, without resorting to -exceptions. It defines combinators to operate on the `result` type -available from OCaml 4.03 in the standard library. - -Rresult depends on the compatibility `result` package and is -distributed under the ISC license. -""" -url { -archive: "http://erratique.ch/software/rresult/releases/rresult-0.6.0.tbz" -checksum: "aba88cffa29081714468c2c7bcdf7fb1" -} diff --git a/esy.lock/opam/seq.base/files/META.seq b/esy.lock/opam/seq.base/files/META.seq deleted file mode 100644 index 06b95ef..0000000 --- a/esy.lock/opam/seq.base/files/META.seq +++ /dev/null @@ -1,4 +0,0 @@ -name="seq" -version="[distributed with OCaml 4.07 or above]" -description="dummy backward-compatibility package for iterators" -requires="" diff --git a/esy.lock/opam/seq.base/files/seq.install b/esy.lock/opam/seq.base/files/seq.install deleted file mode 100644 index c4d7020..0000000 --- a/esy.lock/opam/seq.base/files/seq.install +++ /dev/null @@ -1,3 +0,0 @@ -lib:[ - "META.seq" {"META"} -] diff --git a/esy.lock/opam/seq.base/opam b/esy.lock/opam/seq.base/opam deleted file mode 100644 index b33d8c7..0000000 --- a/esy.lock/opam/seq.base/opam +++ /dev/null @@ -1,15 +0,0 @@ -opam-version: "2.0" -maintainer: " " -authors: " " -homepage: " " -depends: [ - "ocaml" {>= "4.07.0"} -] -dev-repo: "git+https://github.com/ocaml/ocaml.git" -bug-reports: "https://caml.inria.fr/mantis/main_page.php" -synopsis: - "Compatibility package for OCaml's standard iterator type starting from 4.07." -extra-files: [ - ["seq.install" "md5=026b31e1df290373198373d5aaa26e42"] - ["META.seq" "md5=b33c8a1a6c7ed797816ce27df4855107"] -] diff --git a/esy.lock/opam/sexplib.v0.13.0/opam b/esy.lock/opam/sexplib.v0.13.0/opam deleted file mode 100644 index a618c82..0000000 --- a/esy.lock/opam/sexplib.v0.13.0/opam +++ /dev/null @@ -1,29 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/sexplib" -bug-reports: "https://github.com/janestreet/sexplib/issues" -dev-repo: "git+https://github.com/janestreet/sexplib.git" -doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/sexplib/index.html" -license: "MIT" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.04.2"} - "parsexp" {>= "v0.13" & < "v0.14"} - "sexplib0" {>= "v0.13" & < "v0.14"} - "dune" {>= "1.5.1"} - "num" -] -synopsis: "Library for serializing OCaml values to and from S-expressions" -description: " -Part of Jane Street's Core library -The Core suite of libraries is an industrial strength alternative to -OCaml's standard library that was developed by Jane Street, the -largest industrial user of OCaml. -" -url { - src: "https://ocaml.janestreet.com/ocaml-core/v0.13/files/sexplib-v0.13.0.tar.gz" - checksum: "md5=d3dd8eb6f10e64e6766217bf6b57bc93" -} diff --git a/esy.lock/opam/sexplib0.v0.13.0/opam b/esy.lock/opam/sexplib0.v0.13.0/opam deleted file mode 100644 index 27626b3..0000000 --- a/esy.lock/opam/sexplib0.v0.13.0/opam +++ /dev/null @@ -1,26 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/sexplib0" -bug-reports: "https://github.com/janestreet/sexplib0/issues" -dev-repo: "git+https://github.com/janestreet/sexplib0.git" -doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/sexplib0/index.html" -license: "MIT" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.04.2"} - "dune" {>= "1.5.1"} -] -synopsis: "Library containing the definition of S-expressions and some base converters" -description: " -Part of Jane Street's Core library -The Core suite of libraries is an industrial strength alternative to -OCaml's standard library that was developed by Jane Street, the -largest industrial user of OCaml. -" -url { - src: "https://ocaml.janestreet.com/ocaml-core/v0.13/files/sexplib0-v0.13.0.tar.gz" - checksum: "md5=f8a715dffda5599cfae0cb4031d57abe" -} diff --git a/esy.lock/opam/stdio.v0.13.0/opam b/esy.lock/opam/stdio.v0.13.0/opam deleted file mode 100644 index 42d6f14..0000000 --- a/esy.lock/opam/stdio.v0.13.0/opam +++ /dev/null @@ -1,27 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/stdio" -bug-reports: "https://github.com/janestreet/stdio/issues" -dev-repo: "git+https://github.com/janestreet/stdio.git" -doc: "https://ocaml.janestreet.com/ocaml-core/latest/doc/stdio/index.html" -license: "MIT" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" {>= "4.04.2"} - "base" {>= "v0.13" & < "v0.14"} - "dune" {>= "1.5.1"} -] -synopsis: "Standard IO library for OCaml" -description: " -Stdio implements simple input/output functionalities for OCaml. - -It re-exports the input/output functions of the OCaml standard -libraries using a more consistent API. -" -url { - src: "https://ocaml.janestreet.com/ocaml-core/v0.13/files/stdio-v0.13.0.tar.gz" - checksum: "md5=48ef28512ddd51ff9885649dd1fab91d" -} diff --git a/esy.lock/opam/stdlib-shims.0.1.0/opam b/esy.lock/opam/stdlib-shims.0.1.0/opam deleted file mode 100644 index 5839c43..0000000 --- a/esy.lock/opam/stdlib-shims.0.1.0/opam +++ /dev/null @@ -1,27 +0,0 @@ -opam-version: "2.0" -maintainer: "The stdlib-shims programmers" -authors: "The stdlib-shims programmers" -homepage: "https://github.com/ocaml/stdlib-shims" -doc: "https://ocaml.github.io/stdlib-shims/" -dev-repo: "git+https://github.com/ocaml/stdlib-shims.git" -bug-reports: "https://github.com/ocaml/stdlib-shims/issues" -tags: ["stdlib" "compatibility" "org:ocaml"] -license: ["typeof OCaml system"] -depends: [ - "dune" - "ocaml" {>= "4.02.3"} -] -build: [ "dune" "build" "-p" name "-j" jobs ] -synopsis: "Backport some of the new stdlib features to older compiler" -description: """ -Backport some of the new stdlib features to older compiler, -such as the Stdlib module. - -This allows projects that require compatibility with older compiler to -use these new features in their code. -""" -url { - src: - "https://github.com/ocaml/stdlib-shims/releases/download/0.1.0/stdlib-shims-0.1.0.tbz" - checksum: "md5=12b5704eed70c6bff5ac39a16db1425d" -} diff --git a/esy.lock/opam/stringext.1.6.0/opam b/esy.lock/opam/stringext.1.6.0/opam deleted file mode 100644 index 5242fe3..0000000 --- a/esy.lock/opam/stringext.1.6.0/opam +++ /dev/null @@ -1,32 +0,0 @@ -opam-version: "2.0" -maintainer: "rudi.grinberg@gmail.com" -authors: "Rudi Grinberg" -license: "MIT" -homepage: "https://github.com/rgrinberg/stringext" -bug-reports: "https://github.com/rgrinberg/stringext/issues" -depends: [ - "ocaml" {>= "4.02.3"} - "dune" {>= "1.0"} - "ounit" {with-test} - "qtest" {with-test & >= "2.2"} - "base-bytes" -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/rgrinberg/stringext.git" -synopsis: "Extra string functions for OCaml" -description: """ -Extra string functions for OCaml. Mainly splitting. All functions are in the -Stringext module. -""" -url { - src: - "https://github.com/rgrinberg/stringext/releases/download/1.6.0/stringext-1.6.0.tbz" - checksum: [ - "sha256=db41f5d52e9eab17615f110b899dfeb27dd7e7f89cd35ae43827c5119db206ea" - "sha512=d8ebe40f42b598a9bd99f1ef4b00ba93458385a4accd121af66a0bf3b3f8d7135f576740adf1a43081dd409977c2219fd4bdbb5b3d1308890d301d553ed49900" - ] -} diff --git a/esy.lock/opam/tls.0.10.5/opam b/esy.lock/opam/tls.0.10.5/opam deleted file mode 100644 index 65872f2..0000000 --- a/esy.lock/opam/tls.0.10.5/opam +++ /dev/null @@ -1,77 +0,0 @@ -opam-version: "2.0" -name: "tls" -homepage: "https://github.com/mirleft/ocaml-tls" -dev-repo: "git+https://github.com/mirleft/ocaml-tls.git" -bug-reports: "https://github.com/mirleft/ocaml-tls/issues" -doc: "https://mirleft.github.io/ocaml-tls/doc" -author: ["David Kaloper " "Hannes Mehnert "] -maintainer: ["Hannes Mehnert " "David Kaloper "] -license: "BSD2" - -build: [ - [ "ocaml" "pkg/pkg.ml" "build" "--pinned" "%{pinned}%" "--tests" "false" - "--with-lwt" "%{lwt+ptime:installed}%" - "--with-mirage" "%{mirage-flow+mirage-kv+mirage-clock+ptime:installed}%" ] - ["ocaml" "pkg/pkg.ml" "build" "--pinned" "%{pinned}%" "--tests" "true" - "--with-lwt" "%{lwt+ptime:installed}%" - "--with-mirage" "%{mirage-flow+mirage-kv+mirage-clock+ptime:installed}%" ] {with-test} - ["ocaml" "pkg/pkg.ml" "test"] {with-test} -] - -depends: [ - "ocaml" {>= "4.04.2"} - "ocamlfind" {build} - "ocamlbuild" {build} - "topkg" {build} - "ppx_sexp_conv" {< "v0.14"} - "ppx_deriving" - "ppx_cstruct" {>= "3.0.0"} - "cstruct" {>= "4.0.0"} - "cstruct-sexp" - "sexplib" {< "v0.14"} - "nocrypto" {>= "0.5.4"} - "x509" {>= "0.7.0" & < "0.9.0"} - "domain-name" {>= "0.3.0"} - "fmt" - "cstruct-unix" {with-test & >= "3.0.0"} - "ounit" {with-test} -] -depopts: [ - "lwt" - "mirage-flow" - "mirage-kv" - "mirage-clock" - "ptime" -] -conflicts: [ - "lwt" {<"2.4.8"} - "lwt" {with-test & >= "5.0.0"} - "mirage-kv" {<"3.0.0"} - "mirage-flow" {<"2.0.0"} - "mirage-clock" {<"3.0.0"} - "sexplib" {= "v0.9.0"} - "ppx_sexp_conv" {= "v0.11.0"} - "ptime" {< "0.8.1"} -] - -tags: [ "org:mirage"] -synopsis: "Transport Layer Security purely in OCaml" -description: """\ - -Transport Layer Security (TLS) is probably the most widely deployed security -protocol on the Internet. It provides communication privacy to prevent -eavesdropping, tampering, and message forgery. Furthermore, it optionally -provides authentication of the involved endpoints. TLS is commonly deployed for -securing web services ([HTTPS](http://tools.ietf.org/html/rfc2818)), emails, -virtual private networks, and wireless networks. - -TLS uses asymmetric cryptography to exchange a symmetric key, and optionally -authenticate (using X.509) either or both endpoints. It provides algorithmic -agility, which means that the key exchange method, symmetric encryption -algorithm, and hash algorithm are negotiated. - -Read [further](https://nqsb.io) and our [Usenix Security 2015 paper](https://usenix15.nqsb.io).""" -url { -archive: "https://github.com/mirleft/ocaml-tls/releases/download/v0.10.5/tls-0.10.5.tbz" -checksum: "57d9477ea79080e9d2485007289cbc5f" -} \ No newline at end of file diff --git a/esy.lock/opam/topkg.1.0.1/opam b/esy.lock/opam/topkg.1.0.1/opam deleted file mode 100644 index 77ae1f4..0000000 --- a/esy.lock/opam/topkg.1.0.1/opam +++ /dev/null @@ -1,48 +0,0 @@ -opam-version: "2.0" -maintainer: "Daniel Bünzli " -authors: ["Daniel Bünzli "] -homepage: "http://erratique.ch/software/topkg" -doc: "http://erratique.ch/software/topkg/doc" -license: "ISC" -dev-repo: "git+http://erratique.ch/repos/topkg.git" -bug-reports: "https://github.com/dbuenzli/topkg/issues" -tags: ["packaging" "ocamlbuild" "org:erratique"] -depends: [ - "ocaml" {>= "4.03.0"} - "ocamlfind" {build & >= "1.6.1"} - "ocamlbuild" ] -build: [[ - "ocaml" "pkg/pkg.ml" "build" - "--pkg-name" name - "--dev-pkg" "%{pinned}%" ]] -synopsis: """The transitory OCaml software packager""" -description: """\ - -Topkg is a packager for distributing OCaml software. It provides an -API to describe the files a package installs in a given build -configuration and to specify information about the package's -distribution, creation and publication procedures. - -The optional topkg-care package provides the `topkg` command line tool -which helps with various aspects of a package's life cycle: creating -and linting a distribution, releasing it on the WWW, publish its -documentation, add it to the OCaml opam repository, etc. - -Topkg is distributed under the ISC license and has **no** -dependencies. This is what your packages will need as a *build* -dependency. - -Topkg-care is distributed under the ISC license it depends on -[fmt][fmt], [logs][logs], [bos][bos], [cmdliner][cmdliner], -[webbrowser][webbrowser] and `opam-format`. - -[fmt]: http://erratique.ch/software/fmt -[logs]: http://erratique.ch/software/logs -[bos]: http://erratique.ch/software/bos -[cmdliner]: http://erratique.ch/software/cmdliner -[webbrowser]: http://erratique.ch/software/webbrowser -""" -url { -archive: "http://erratique.ch/software/topkg/releases/topkg-1.0.1.tbz" -checksum: "16b90e066d8972a5ef59655e7c28b3e9" -} diff --git a/esy.lock/opam/tyxml.4.3.0/opam b/esy.lock/opam/tyxml.4.3.0/opam deleted file mode 100644 index 93872f8..0000000 --- a/esy.lock/opam/tyxml.4.3.0/opam +++ /dev/null @@ -1,45 +0,0 @@ -opam-version: "2.0" -maintainer: "dev@ocsigen.org" -homepage: "https://github.com/ocsigen/tyxml/" -bug-reports: "https://github.com/ocsigen/tyxml/issues" -doc: "https://ocsigen.org/tyxml/manual/" -dev-repo: "git+https://github.com/ocsigen/tyxml.git" -license: "LGPL-2.1-only with OCaml-LGPL-linking-exception" - -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] - -depends: [ - "ocaml" {>= "4.02"} - "re" {>= "1.5.0"} - ("ocaml" {>= "4.07"} | "re" {>= "1.8.0"}) - "dune" - "alcotest" {with-test} - "seq" - "uutf" {>= "1.0.0"} -] - -synopsis:"TyXML is a library for building correct HTML and SVG documents" -description:""" -TyXML provides a set of convenient combinators that uses the OCaml -type system to ensure the validity of the generated documents. TyXML -can be used with any representation of HTML and SVG: the textual one, -provided directly by this package, or DOM trees (`js_of_ocaml-tyxml`) -virtual DOM (`virtual-dom`) and reactive or replicated trees -(`eliom`). You can also create your own representation and use it to -instantiate a new set of combinators. - -```ocaml -open Tyxml -let to_ocaml = Html.(a ~a:[a_href "ocaml.org"] [txt "OCaml!"]) -``` -""" -authors: "The ocsigen team" -url { - src: - "https://github.com/ocsigen/tyxml/releases/download/4.3.0/tyxml-4.3.0.tbz" - checksum: "md5=fd834a567f813bf447cab5f4c3a723e2" -} diff --git a/esy.lock/opam/uchar.0.0.2/opam b/esy.lock/opam/uchar.0.0.2/opam deleted file mode 100644 index 428d7aa..0000000 --- a/esy.lock/opam/uchar.0.0.2/opam +++ /dev/null @@ -1,36 +0,0 @@ -opam-version: "2.0" -maintainer: "Daniel Bünzli " -authors: ["Daniel Bünzli "] -homepage: "http://ocaml.org" -doc: "https://ocaml.github.io/uchar/" -dev-repo: "git+https://github.com/ocaml/uchar.git" -bug-reports: "https://github.com/ocaml/uchar/issues" -tags: [ "text" "character" "unicode" "compatibility" "org:ocaml.org" ] -license: "typeof OCaml system" -depends: [ - "ocaml" {>= "3.12.0"} - "ocamlbuild" {build} -] -build: [ - ["ocaml" "pkg/git.ml"] - [ - "ocaml" - "pkg/build.ml" - "native=%{ocaml:native}%" - "native-dynlink=%{ocaml:native-dynlink}%" - ] -] -synopsis: "Compatibility library for OCaml's Uchar module" -description: """ -The `uchar` package provides a compatibility library for the -[`Uchar`][1] module introduced in OCaml 4.03. - -The `uchar` package is distributed under the license of the OCaml -compiler. See [LICENSE](LICENSE) for details. - -[1]: http://caml.inria.fr/pub/docs/manual-ocaml/libref/Uchar.html""" -url { - src: - "https://github.com/ocaml/uchar/releases/download/v0.0.2/uchar-0.0.2.tbz" - checksum: "md5=c9ba2c738d264c420c642f7bb1cf4a36" -} diff --git a/esy.lock/opam/uri-sexp.3.1.0/opam b/esy.lock/opam/uri-sexp.3.1.0/opam deleted file mode 100644 index 01b8f87..0000000 --- a/esy.lock/opam/uri-sexp.3.1.0/opam +++ /dev/null @@ -1,33 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: ["Anil Madhavapeddy" "David Sheets" "Rudi Grinberg"] -license: "ISC" -tags: ["url" "uri" "org:mirage" "org:xapi-project"] -homepage: "https://github.com/mirage/ocaml-uri" -bug-reports: "https://github.com/mirage/ocaml-uri/issues" -dev-repo: "git+https://github.com/mirage/ocaml-uri.git" -doc: "https://mirage.github.io/ocaml-uri/" -synopsis: "An RFC3986 URI/URL parsing library" -description: """ -ocaml-uri with sexp support -""" -depends: [ - "uri" {= version} - "dune" {>= "1.2.0"} - "ppx_sexp_conv" {>= "v0.9.0"} - "sexplib0" - "ounit" {with-test} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -url { - src: - "https://github.com/mirage/ocaml-uri/releases/download/v3.1.0/uri-v3.1.0.tbz" - checksum: [ - "sha256=c452823fd870cf7cffe51aef3e9ca646a382dc6f87282f2b16bfe30a7515ac43" - "sha512=c015576bb077fd243022bcd8804e628d23a253dcd8bbdda8dc2a57e86cfeb9fd629087ec7d7e23dc71dd7cd137450ca2c5ecf8fb7d184ec9d1d4e41f6f83ee38" - ] -} diff --git a/esy.lock/opam/uri.3.1.0/opam b/esy.lock/opam/uri.3.1.0/opam deleted file mode 100644 index 73cce66..0000000 --- a/esy.lock/opam/uri.3.1.0/opam +++ /dev/null @@ -1,35 +0,0 @@ -opam-version: "2.0" -maintainer: "anil@recoil.org" -authors: ["Anil Madhavapeddy" "David Sheets" "Rudi Grinberg"] -license: "ISC" -tags: ["url" "uri" "org:mirage" "org:xapi-project"] -homepage: "https://github.com/mirage/ocaml-uri" -bug-reports: "https://github.com/mirage/ocaml-uri/issues" -dev-repo: "git+https://github.com/mirage/ocaml-uri.git" -doc: "https://mirage.github.io/ocaml-uri/" -synopsis: "An RFC3986 URI/URL parsing library" -description: """ -This is an OCaml implementation of the [RFC3986](http://tools.ietf.org/html/rfc3986) specification -for parsing URI or URLs. -""" -depends: [ - "ocaml" {>= "4.04.0"} - "dune" {>= "1.2.0"} - "ounit" {with-test & >= "1.0.2"} - "ppx_sexp_conv" {with-test & >= "v0.9.0"} - "re" {>= "1.9.0"} - "stringext" {>= "1.4.0"} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -url { - src: - "https://github.com/mirage/ocaml-uri/releases/download/v3.1.0/uri-v3.1.0.tbz" - checksum: [ - "sha256=c452823fd870cf7cffe51aef3e9ca646a382dc6f87282f2b16bfe30a7515ac43" - "sha512=c015576bb077fd243022bcd8804e628d23a253dcd8bbdda8dc2a57e86cfeb9fd629087ec7d7e23dc71dd7cd137450ca2c5ecf8fb7d184ec9d1d4e41f6f83ee38" - ] -} diff --git a/esy.lock/opam/uutf.1.0.2/opam b/esy.lock/opam/uutf.1.0.2/opam deleted file mode 100644 index 3a9f567..0000000 --- a/esy.lock/opam/uutf.1.0.2/opam +++ /dev/null @@ -1,40 +0,0 @@ -opam-version: "2.0" -maintainer: "Daniel Bünzli " -authors: ["Daniel Bünzli "] -homepage: "http://erratique.ch/software/uutf" -doc: "http://erratique.ch/software/uutf/doc/Uutf" -dev-repo: "git+http://erratique.ch/repos/uutf.git" -bug-reports: "https://github.com/dbuenzli/uutf/issues" -tags: [ "unicode" "text" "utf-8" "utf-16" "codec" "org:erratique" ] -license: "ISC" -depends: [ - "ocaml" {>= "4.01.0"} - "ocamlfind" {build} - "ocamlbuild" {build} - "topkg" {build} - "uchar" -] -depopts: ["cmdliner"] -conflicts: ["cmdliner" { < "0.9.6"} ] -build: [[ - "ocaml" "pkg/pkg.ml" "build" - "--pinned" "%{pinned}%" - "--with-cmdliner" "%{cmdliner:installed}%" ]] -synopsis: """Non-blocking streaming Unicode codec for OCaml""" -description: """\ - -Uutf is a non-blocking streaming codec to decode and encode the UTF-8, -UTF-16, UTF-16LE and UTF-16BE encoding schemes. It can efficiently -work character by character without blocking on IO. Decoders perform -character position tracking and support newline normalization. - -Functions are also provided to fold over the characters of UTF encoded -OCaml string values and to directly encode characters in OCaml -Buffer.t values. - -Uutf has no dependency and is distributed under the ISC license. -""" -url { -archive: "http://erratique.ch/software/uutf/releases/uutf-1.0.2.tbz" -checksum: "a7c542405a39630c689a82bd7ef2292c" -} diff --git a/esy.lock/opam/x509.0.8.1/opam b/esy.lock/opam/x509.0.8.1/opam deleted file mode 100644 index b2c9f0e..0000000 --- a/esy.lock/opam/x509.0.8.1/opam +++ /dev/null @@ -1,51 +0,0 @@ -opam-version: "2.0" -maintainer: [ - "Hannes Mehnert " -] -authors: [ - "Hannes Mehnert " - "David Kaloper " -] -license: "BSD2" -tags: "org:mirage" -homepage: "https://github.com/mirleft/ocaml-x509" -doc: "https://mirleft.github.io/ocaml-x509/doc" -bug-reports: "https://github.com/mirleft/ocaml-x509/issues" -depends: [ - "ocaml" {>= "4.05.0"} - "dune" {>= "1.2"} - "cstruct" {>= "4.0.0"} - "asn1-combinators" {>= "0.2.0"} - "ptime" - "nocrypto" {>= "0.5.3"} - "rresult" - "fmt" {>= "0.8.7"} - "alcotest" {with-test} - "cstruct-unix" {with-test & >= "3.0.0"} - "gmap" {>= "0.3.0"} - "domain-name" {>= "0.3.0"} -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/mirleft/ocaml-x509.git" -synopsis: "Public Key Infrastructure (RFC 5280, PKCS) purely in OCaml" -description: """ -X.509 is a public key infrastructure used mostly on the Internet. It consists -of certificates which include public keys and identifiers, signed by an -authority. Authorities must be exchanged over a second channel to establish the -trust relationship. This library implements most parts of RFC5280 and RFC6125. -The Public Key Cryptography Standards (PKCS) defines encoding and decoding -(in ASN.1 DER and PEM format), which is also implemented by this library - -namely PKCS 1, PKCS 7, PKCS 8, PKCS 9 and PKCS 10. -""" -url { - src: - "https://github.com/mirleft/ocaml-x509/releases/download/v0.8.1/x509-v0.8.1.tbz" - checksum: [ - "sha256=a586b925fe7e84b1a5833dacf66a920967683cf8aab21d7291a3074630e57880" - "sha512=e355420d608eb7840a64e0fe673cef459fc377163801ce3cca4f0dfb4b3f294c6d2273442b475aa01b4660362c987e81c363de2de602a1a38ab3b143118b9cf1" - ] -} diff --git a/esy.lock/opam/yojson.1.7.0/opam b/esy.lock/opam/yojson.1.7.0/opam deleted file mode 100644 index ffef068..0000000 --- a/esy.lock/opam/yojson.1.7.0/opam +++ /dev/null @@ -1,38 +0,0 @@ -opam-version: "2.0" -maintainer: "martin@mjambon.com" -authors: ["Martin Jambon"] -homepage: "https://github.com/ocaml-community/yojson" -bug-reports: "https://github.com/ocaml-community/yojson/issues" -dev-repo: "git+https://github.com/ocaml-community/yojson.git" -doc: "https://ocaml-community.github.io/yojson/" -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] -] -run-test: [["dune" "runtest" "-p" name "-j" jobs]] -depends: [ - "ocaml" {>= "4.02.3"} - "dune" - "cppo" {build} - "easy-format" - "biniou" {>= "1.2.0"} - "alcotest" {with-test & >= "0.8.5"} -] -synopsis: - "Yojson is an optimized parsing and printing library for the JSON format" -description: """ -Yojson is an optimized parsing and printing library for the JSON format. - -It addresses a few shortcomings of json-wheel including 2x speedup, -polymorphic variants and optional syntax for tuples and variants. - -ydump is a pretty-printing command-line program provided with the -yojson package. - -The program atdgen can be used to derive OCaml-JSON serializers and -deserializers from type definitions.""" -url { - src: - "https://github.com/ocaml-community/yojson/releases/download/1.7.0/yojson-1.7.0.tbz" - checksum: "md5=b89d39ca3f8c532abe5f547ad3b8f84d" -} diff --git a/esy.lock/opam/zarith.1.9.1/opam b/esy.lock/opam/zarith.1.9.1/opam deleted file mode 100644 index 765a409..0000000 --- a/esy.lock/opam/zarith.1.9.1/opam +++ /dev/null @@ -1,47 +0,0 @@ -opam-version: "2.0" -maintainer: "Xavier Leroy " -authors: [ - "Antoine Miné" - "Xavier Leroy" - "Pascal Cuoq" -] -homepage: "https://github.com/ocaml/Zarith" -bug-reports: "https://github.com/ocaml/Zarith/issues" -dev-repo: "git+https://github.com/ocaml/Zarith.git" -build: [ - ["./configure"] {os != "openbsd" & os != "freebsd" & os != "macos"} - [ - "sh" - "-exc" - "LDFLAGS=\"$LDFLAGS -L/usr/local/lib\" CFLAGS=\"$CFLAGS -I/usr/local/include\" ./configure" - ] {os = "openbsd" | os = "freebsd"} - [ - "sh" - "-exc" - "LDFLAGS=\"$LDFLAGS -L/opt/local/lib -L/usr/local/lib\" CFLAGS=\"$CFLAGS -I/opt/local/include -I/usr/local/include\" ./configure" - ] {os = "macos"} - [make] -] -install: [ - [make "install"] -] -depends: [ - "ocaml" - "ocamlfind" {build} - "conf-gmp" - "conf-perl" {build} -] -synopsis: - "Implements arithmetic and logical operations over arbitrary-precision integers" -description: """ -The Zarith library implements arithmetic and logical operations over -arbitrary-precision integers. It uses GMP to efficiently implement -arithmetic over big integers. Small integers are represented as Caml -unboxed integers, for speed and space economy.""" -url { - src: "https://github.com/ocaml/Zarith/archive/release-1.9.1.tar.gz" - checksum: [ - "md5=af41b7534a4c91a8f774f04e307c1c66" - "sha512=e77620c66a59d35811acfc45c7ef3f0d50d3042194654b1f5b652a2ed5fb9d5f88e9173222e5ced286c61854434da05a4d96668089faa66ff2917afa677fc32f" - ] -} diff --git a/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/.gitignore b/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/.gitignore deleted file mode 100644 index 678a8a2..0000000 --- a/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -_esy -*~ \ No newline at end of file diff --git a/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/package.json b/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/package.json deleted file mode 100644 index b63dc31..0000000 --- a/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "esy-gmp", - "version": "6.1.2001", - "description": "GMP packaged for esy", - "source": "https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz#9dc6981197a7d92f339192eea974f5eca48fcffe", - "override": { - "buildsInSource": true, - "build": [ - "find ./ -exec touch -t 200905010101 {} +", - "./configure --enable-fat --prefix=#{self.install} #{os == 'windows' ? '--host x86_64-w64-mingw32' : ''} --with-pic", - "make" - ], - "install": [ - "make install" - ], - "exportedEnv": { - "LDFLAGS": { - "scope": "global", - "val": "-L#{self.lib} -lgmp" - }, - "CPPFLAGS": { - "scope": "global", - "val": "-I#{self.install / 'include'}" - }, - "LD_LIBRARY_PATH": { - "scope": "global", - "val": "#{self.lib}:$LD_LIBRARY_PATH" - }, - "LIBRARY_PATH": { - "scope": "global", - "val": "#{self.lib}:$LIBRARY_PATH" - }, - "CPATH": { - "scope": "global", - "val": "#{self.install / 'include'}:$CPATH" - } - } - } -} diff --git a/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/test/package.json b/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/test/package.json deleted file mode 100644 index 66525aa..0000000 --- a/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/test/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "esy-gmp-test", - "description": "For manual testing only", - "version": "0.1.0", - "description": "GMP packaged for esy", - "license": "MIT", - "esy": { - "buildsInSource": true, - "build": [ - "#{os == 'windows' ? 'x86_64-w64-mingw32-gcc': 'gcc'} $CFLAGS -o testinggmp test.c $LDFLAGS" - ], - "install": "cp testinggmp #{self.bin}" - }, - "dependencies": { - "gmp": "esy-packages/esy-gmp#e2a8fab86e6ff2b26637b3249ee149d29b3430dd" - } -} diff --git a/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/test/test.c b/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/test/test.c deleted file mode 100644 index 7162f62..0000000 --- a/esy.lock/overrides/7e96a8d6f059163f08fee9f6b9790b0b/test/test.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include -#include - -int main() { - mpz_t i, j, k; - mpz_init_set_str (i, "1a", 16); - mpz_init (j); - mpz_init (k); - mpz_sqrtrem (j, k, i); - if (mpz_get_si (j) != 5 || mpz_get_si (k) != 1) abort(); - printf("%s\n", "Works as expected"); - return 0; -} diff --git a/esy.lock/overrides/opam__s__num_opam__c__1.3_opam_override/files/num-1.3.patch b/esy.lock/overrides/opam__s__num_opam__c__1.3_opam_override/files/num-1.3.patch deleted file mode 100644 index dad75fa..0000000 --- a/esy.lock/overrides/opam__s__num_opam__c__1.3_opam_override/files/num-1.3.patch +++ /dev/null @@ -1,58 +0,0 @@ -diff --git a/src/Makefile b/src/Makefile -index 8ad0e2c..d41d63c 100644 ---- a/src/Makefile -+++ b/src/Makefile -@@ -1,16 +1,16 @@ --OCAMLC=ocamlc --OCAMLOPT=ocamlopt --OCAMLDEP=ocamldep --OCAMLMKLIB=ocamlmklib --OCAMLFIND=ocamlfind -+OCAMLC=$(shell which ocamlc) -+OCAMLOPT=$(shell which ocamlopt) -+OCAMLDEP=$(shell which ocamldep) -+OCAMLMKLIB=$(shell which ocamlmklib) -+OCAMLFIND=$(shell which ocamlfind) - INSTALL_DATA=install -m 644 - INSTALL_DLL=install - INSTALL_DIR=install -d - STDLIBDIR=$(shell $(OCAMLC) -where) - DESTDIR ?= - --include $(STDLIBDIR)/Makefile.config - -+include $(STDLIBDIR)/Makefile.config - ifeq "$(filter i386 amd64 arm64 power,$(ARCH))" "" - # Unsupported architecture - BNG_ARCH=generic -@@ -86,14 +86,14 @@ endif - VERSION=$(shell sed -ne 's/^ *version *: *"\([^"]*\)".*$$/\1/p' ../num.opam) - - install: -- $(INSTALL_DIR) $(DESTDIR)$(STDLIBDIR) -+ $(INSTALL_DIR) $(LIBDIR) - sed -e 's/%%VERSION%%/$(VERSION)/g' META.in > META - $(OCAMLFIND) install num META - rm -f META -- $(INSTALL_DATA) $(TOINSTALL) $(DESTDIR)$(STDLIBDIR) -+ $(INSTALL_DATA) $(TOINSTALL) $(LIBDIR) - ifeq "$(SUPPORTS_SHARED_LIBRARIES)" "true" -- $(INSTALL_DIR) $(DESTDIR)$(STDLIBDIR)/stublibs -- $(INSTALL_DLL) $(TOINSTALL_STUBS) $(DESTDIR)$(STDLIBDIR)/stublibs -+ $(INSTALL_DIR) $(LIBDIR)/stublibs -+ $(INSTALL_DLL) $(TOINSTALL_STUBS) $(LIBDIR)/stublibs - endif - - findlib-install: -@@ -105,9 +105,9 @@ findlib-uninstall: - $(OCAMLFIND) remove num - - uninstall: findlib-uninstall -- cd $(DESTDIR)$(STDLIBDIR) && rm -f $(TOINSTALL) -+ cd $(LIBDIR) && rm -f $(TOINSTALL) - ifeq "$(SUPPORTS_SHARED_LIBRARIES)" "true" -- cd $(DESTDIR)$(STDLIBDIR)/stublibs && rm -f $(TOINSTALL_STUBS) -+ cd $(LIBDIR)/stublibs && rm -f $(TOINSTALL_STUBS) - endif - - clean: diff --git a/esy.lock/overrides/opam__s__num_opam__c__1.3_opam_override/package.json b/esy.lock/overrides/opam__s__num_opam__c__1.3_opam_override/package.json deleted file mode 100644 index 4199a64..0000000 --- a/esy.lock/overrides/opam__s__num_opam__c__1.3_opam_override/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "buildsInSource": true, - "build": [ - [ - "make" - ] - ], - "install": [ - [ - "make", - "LIBDIR=#{self.install / 'lib'}", - "findlib-install" - ] - ], - "exportedEnv": { - "CAML_LD_LIBRARY_PATH": { - "val": "#{self.install / 'lib' / 'num' : $CAML_LD_LIBRARY_PATH}", - "scope": "global" - } - }, - "dependencies": { - "ocaml": "*", - "@opam/ocamlfind": "*" - } -} diff --git a/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/files/ocamlbuild-0.14.0.patch b/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/files/ocamlbuild-0.14.0.patch deleted file mode 100644 index 4d5bea0..0000000 --- a/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/files/ocamlbuild-0.14.0.patch +++ /dev/null @@ -1,463 +0,0 @@ ---- ./Makefile -+++ ./Makefile -@@ -213,7 +213,7 @@ - rm -f man/ocamlbuild.1 - - man/options_man.byte: src/ocamlbuild_pack.cmo -- $(OCAMLC) $^ -I src man/options_man.ml -o man/options_man.byte -+ $(OCAMLC) -I +unix unix.cma $^ -I src man/options_man.ml -o man/options_man.byte - - clean:: - rm -f man/options_man.cm* ---- ./src/command.ml -+++ ./src/command.ml -@@ -148,9 +148,10 @@ - let self = string_of_command_spec_with_calls call_with_tags call_with_target resolve_virtuals in - let b = Buffer.create 256 in - (* The best way to prevent bash from switching to its windows-style -- * quote-handling is to prepend an empty string before the command name. *) -+ * quote-handling is to prepend an empty string before the command name. -+ * space seems to work, too - and the ouput is nicer *) - if Sys.os_type = "Win32" then -- Buffer.add_string b "''"; -+ Buffer.add_char b ' '; - let first = ref true in - let put_space () = - if !first then -@@ -260,7 +261,7 @@ - - let execute_many ?(quiet=false) ?(pretend=false) cmds = - add_parallel_stat (List.length cmds); -- let degraded = !*My_unix.is_degraded || Sys.os_type = "Win32" in -+ let degraded = !*My_unix.is_degraded in - let jobs = !jobs in - if jobs < 0 then invalid_arg "jobs < 0"; - let max_jobs = if jobs = 0 then None else Some jobs in ---- ./src/findlib.ml -+++ ./src/findlib.ml -@@ -66,9 +66,6 @@ - (fun command -> lexer & Lexing.from_string & run_and_read command) - command - --let run_and_read command = -- Printf.ksprintf run_and_read command -- - let rec query name = - try - Hashtbl.find packages name -@@ -135,7 +132,8 @@ - with Not_found -> s - - let list () = -- List.map before_space (split_nl & run_and_read "%s list" ocamlfind) -+ let cmd = Shell.quote_filename_if_needed ocamlfind ^ " list" in -+ List.map before_space (split_nl & run_and_read cmd) - - (* The closure algorithm is easy because the dependencies are already closed - and sorted for each package. We only have to make the union. We could also ---- ./src/main.ml -+++ ./src/main.ml -@@ -162,6 +162,9 @@ - Tags.mem "traverse" tags - || List.exists (Pathname.is_prefix path_name) !Options.include_dirs - || List.exists (Pathname.is_prefix path_name) target_dirs) -+ && ((* beware: !Options.build_dir is an absolute directory *) -+ Pathname.normalize !Options.build_dir -+ <> Pathname.normalize (Pathname.pwd/path_name)) - end - end - end ---- ./src/my_std.ml -+++ ./src/my_std.ml -@@ -271,13 +271,107 @@ - try Array.iter (fun x -> if x = basename then raise Exit) a; false - with Exit -> true - -+let command_plain = function -+| [| |] -> 0 -+| margv -> -+ let rec waitpid a b = -+ match Unix.waitpid a b with -+ | exception (Unix.Unix_error(Unix.EINTR,_,_)) -> waitpid a b -+ | x -> x -+ in -+ let pid = Unix.(create_process margv.(0) margv stdin stdout stderr) in -+ let pid', process_status = waitpid [] pid in -+ assert (pid = pid'); -+ match process_status with -+ | Unix.WEXITED n -> n -+ | Unix.WSIGNALED _ -> 2 (* like OCaml's uncaught exceptions *) -+ | Unix.WSTOPPED _ -> 127 -+ -+(* can't use Lexers because of circular dependency *) -+let split_path_win str = -+ let rec aux pos = -+ try -+ let i = String.index_from str pos ';' in -+ let len = i - pos in -+ if len = 0 then -+ aux (succ i) -+ else -+ String.sub str pos (i - pos) :: aux (succ i) -+ with Not_found | Invalid_argument _ -> -+ let len = String.length str - pos in -+ if len = 0 then [] else [String.sub str pos len] -+ in -+ aux 0 -+ -+let windows_shell = lazy begin -+ let rec iter = function -+ | [] -> [| "bash.exe" ; "--norc" ; "--noprofile" |] -+ | hd::tl -> -+ let dash = Filename.concat hd "dash.exe" in -+ if Sys.file_exists dash then [|dash|] else -+ let bash = Filename.concat hd "bash.exe" in -+ if Sys.file_exists bash = false then iter tl else -+ (* if sh.exe and bash.exe exist in the same dir, choose sh.exe *) -+ let sh = Filename.concat hd "sh.exe" in -+ if Sys.file_exists sh then [|sh|] else [|bash ; "--norc" ; "--noprofile"|] -+ in -+ split_path_win (try Sys.getenv "PATH" with Not_found -> "") |> iter -+end -+ -+let prep_windows_cmd cmd = -+ (* workaround known ocaml bug, remove later *) -+ if String.contains cmd '\t' && String.contains cmd ' ' = false then -+ " " ^ cmd -+ else -+ cmd -+ -+let run_with_shell = function -+| "" -> 0 -+| cmd -> -+ let cmd = prep_windows_cmd cmd in -+ let shell = Lazy.force windows_shell in -+ let qlen = Filename.quote cmd |> String.length in -+ (* old versions of dash had problems with bs *) -+ try -+ if qlen < 7_900 then -+ command_plain (Array.append shell [| "-ec" ; cmd |]) -+ else begin -+ (* it can still work, if the called command is a cygwin tool *) -+ let ch_closed = ref false in -+ let file_deleted = ref false in -+ let fln,ch = -+ Filename.open_temp_file -+ ~mode:[Open_binary] -+ "ocamlbuildtmp" -+ ".sh" -+ in -+ try -+ let f_slash = String.map ( fun x -> if x = '\\' then '/' else x ) fln in -+ output_string ch cmd; -+ ch_closed:= true; -+ close_out ch; -+ let ret = command_plain (Array.append shell [| "-e" ; f_slash |]) in -+ file_deleted:= true; -+ Sys.remove fln; -+ ret -+ with -+ | x -> -+ if !ch_closed = false then -+ close_out_noerr ch; -+ if !file_deleted = false then -+ (try Sys.remove fln with _ -> ()); -+ raise x -+ end -+ with -+ | (Unix.Unix_error _) as x -> -+ (* Sys.command doesn't raise an exception, so run_with_shell also won't -+ raise *) -+ Printexc.to_string x ^ ":" ^ cmd |> prerr_endline; -+ 1 -+ - let sys_command = -- match Sys.os_type with -- | "Win32" -> fun cmd -> -- if cmd = "" then 0 else -- let cmd = "bash --norc -c " ^ Filename.quote cmd in -- Sys.command cmd -- | _ -> fun cmd -> if cmd = "" then 0 else Sys.command cmd -+ if Sys.win32 then run_with_shell -+ else fun cmd -> if cmd = "" then 0 else Sys.command cmd - - (* FIXME warning fix and use Filename.concat *) - let filename_concat x y = ---- ./src/my_std.mli -+++ ./src/my_std.mli -@@ -69,3 +69,6 @@ - - val split_ocaml_version : (int * int * int * string) option - (** (major, minor, patchlevel, rest) *) -+ -+val windows_shell : string array Lazy.t -+val prep_windows_cmd : string -> string ---- ./src/ocamlbuild_executor.ml -+++ ./src/ocamlbuild_executor.ml -@@ -34,6 +34,8 @@ - job_stdin : out_channel; - job_stderr : in_channel; - job_buffer : Buffer.t; -+ job_pid : int; -+ job_tmp_file: string option; - mutable job_dying : bool; - };; - -@@ -76,6 +78,61 @@ - in - loop 0 - ;; -+ -+let open_process_full_win cmd env = -+ let (in_read, in_write) = Unix.pipe () in -+ let (out_read, out_write) = Unix.pipe () in -+ let (err_read, err_write) = Unix.pipe () in -+ Unix.set_close_on_exec in_read; -+ Unix.set_close_on_exec out_write; -+ Unix.set_close_on_exec err_read; -+ let inchan = Unix.in_channel_of_descr in_read in -+ let outchan = Unix.out_channel_of_descr out_write in -+ let errchan = Unix.in_channel_of_descr err_read in -+ let shell = Lazy.force Ocamlbuild_pack.My_std.windows_shell in -+ let test_cmd = -+ String.concat " " (List.map Filename.quote (Array.to_list shell)) ^ -+ "-ec " ^ -+ Filename.quote (Ocamlbuild_pack.My_std.prep_windows_cmd cmd) in -+ let argv,tmp_file = -+ if String.length test_cmd < 7_900 then -+ Array.append -+ shell -+ [| "-ec" ; Ocamlbuild_pack.My_std.prep_windows_cmd cmd |],None -+ else -+ let fln,ch = Filename.open_temp_file ~mode:[Open_binary] "ocamlbuild" ".sh" in -+ output_string ch (Ocamlbuild_pack.My_std.prep_windows_cmd cmd); -+ close_out ch; -+ let fln' = String.map (function '\\' -> '/' | c -> c) fln in -+ Array.append -+ shell -+ [| "-c" ; fln' |], Some fln in -+ let pid = -+ Unix.create_process_env argv.(0) argv env out_read in_write err_write in -+ Unix.close out_read; -+ Unix.close in_write; -+ Unix.close err_write; -+ (pid, inchan, outchan, errchan,tmp_file) -+ -+let close_process_full_win (pid,inchan, outchan, errchan, tmp_file) = -+ let delete tmp_file = -+ match tmp_file with -+ | None -> () -+ | Some x -> try Sys.remove x with Sys_error _ -> () in -+ let tmp_file_deleted = ref false in -+ try -+ close_in inchan; -+ close_out outchan; -+ close_in errchan; -+ let res = snd(Unix.waitpid [] pid) in -+ tmp_file_deleted := true; -+ delete tmp_file; -+ res -+ with -+ | x when tmp_file <> None && !tmp_file_deleted = false -> -+ delete tmp_file; -+ raise x -+ - (* ***) - (*** execute *) - (* XXX: Add test for non reentrancy *) -@@ -130,10 +187,16 @@ - (*** add_job *) - let add_job cmd rest result id = - (*display begin fun oc -> fp oc "Job %a is %s\n%!" print_job_id id cmd; end;*) -- let (stdout', stdin', stderr') = open_process_full cmd env in -+ let (pid,stdout', stdin', stderr', tmp_file) = -+ if Sys.win32 then open_process_full_win cmd env else -+ let a,b,c = open_process_full cmd env in -+ -1,a,b,c,None -+ in - incr jobs_active; -- set_nonblock (doi stdout'); -- set_nonblock (doi stderr'); -+ if not Sys.win32 then ( -+ set_nonblock (doi stdout'); -+ set_nonblock (doi stderr'); -+ ); - let job = - { job_id = id; - job_command = cmd; -@@ -143,7 +206,9 @@ - job_stdin = stdin'; - job_stderr = stderr'; - job_buffer = Buffer.create 1024; -- job_dying = false } -+ job_dying = false; -+ job_tmp_file = tmp_file; -+ job_pid = pid } - in - outputs := FDM.add (doi stdout') job (FDM.add (doi stderr') job !outputs); - jobs := JS.add job !jobs; -@@ -199,6 +264,7 @@ - try - read fd u 0 (Bytes.length u) - with -+ | Unix.Unix_error(Unix.EPIPE,_,_) when Sys.win32 -> 0 - | Unix.Unix_error(e,_,_) -> - let msg = error_message e in - display (fun oc -> fp oc -@@ -241,14 +307,19 @@ - decr jobs_active; - - (* PR#5371: we would get EAGAIN below otherwise *) -- clear_nonblock (doi job.job_stdout); -- clear_nonblock (doi job.job_stderr); -- -+ if not Sys.win32 then ( -+ clear_nonblock (doi job.job_stdout); -+ clear_nonblock (doi job.job_stderr); -+ ); - do_read ~loop:true (doi job.job_stdout) job; - do_read ~loop:true (doi job.job_stderr) job; - outputs := FDM.remove (doi job.job_stdout) (FDM.remove (doi job.job_stderr) !outputs); - jobs := JS.remove job !jobs; -- let status = close_process_full (job.job_stdout, job.job_stdin, job.job_stderr) in -+ let status = -+ if Sys.win32 then -+ close_process_full_win (job.job_pid, job.job_stdout, job.job_stdin, job.job_stderr, job.job_tmp_file) -+ else -+ close_process_full (job.job_stdout, job.job_stdin, job.job_stderr) in - - let shown = ref false in - ---- ./src/ocamlbuild_unix_plugin.ml -+++ ./src/ocamlbuild_unix_plugin.ml -@@ -48,12 +48,22 @@ - end - - let run_and_open s kont = -+ let s_orig = s in -+ let s = -+ (* Be consistent! My_unix.run_and_open uses My_std.sys_command and -+ sys_command uses bash. *) -+ if Sys.win32 = false then s else -+ let l = match Lazy.force My_std.windows_shell |> Array.to_list with -+ | hd::tl -> (Filename.quote hd)::tl -+ | _ -> assert false in -+ "\"" ^ (String.concat " " l) ^ " -ec " ^ Filename.quote (" " ^ s) ^ "\"" -+ in - let ic = Unix.open_process_in s in - let close () = - match Unix.close_process_in ic with - | Unix.WEXITED 0 -> () - | Unix.WEXITED _ | Unix.WSIGNALED _ | Unix.WSTOPPED _ -> -- failwith (Printf.sprintf "Error while running: %s" s) in -+ failwith (Printf.sprintf "Error while running: %s" s_orig) in - let res = try - kont ic - with e -> (close (); raise e) ---- ./src/options.ml -+++ ./src/options.ml -@@ -174,11 +174,24 @@ - build_dir := Filename.concat (Sys.getcwd ()) s - else - build_dir := s -+ -+let slashify = -+ if Sys.win32 then fun p -> String.map (function '\\' -> '/' | x -> x) p -+ else fun p ->p -+ -+let sb () = -+ match Sys.os_type with -+ | "Win32" -> -+ (try set_binary_mode_out stdout true with _ -> ()); -+ | _ -> () -+ -+ - let spec = ref ( - let print_version () = -+ sb (); - Printf.printf "ocamlbuild %s\n%!" Ocamlbuild_config.version; raise Exit_OK - in -- let print_vnum () = print_endline Ocamlbuild_config.version; raise Exit_OK in -+ let print_vnum () = sb (); print_endline Ocamlbuild_config.version; raise Exit_OK in - Arg.align - [ - "-version", Unit print_version , " Display the version"; -@@ -257,8 +270,8 @@ - "-build-dir", String set_build_dir, " Set build directory (implies no-links)"; - "-install-lib-dir", Set_string Ocamlbuild_where.libdir, " Set the install library directory"; - "-install-bin-dir", Set_string Ocamlbuild_where.bindir, " Set the install binary directory"; -- "-where", Unit (fun () -> print_endline !Ocamlbuild_where.libdir; raise Exit_OK), " Display the install library directory"; -- "-which", String (fun cmd -> print_endline (find_tool cmd); raise Exit_OK), " Display path to the tool command"; -+ "-where", Unit (fun () -> sb (); print_endline (slashify !Ocamlbuild_where.libdir); raise Exit_OK), " Display the install library directory"; -+ "-which", String (fun cmd -> sb (); print_endline (slashify (find_tool cmd)); raise Exit_OK), " Display path to the tool command"; - "-ocamlc", set_cmd ocamlc, " Set the OCaml bytecode compiler"; - "-plugin-ocamlc", set_cmd plugin_ocamlc, " Set the OCaml bytecode compiler \ - used when building myocamlbuild.ml (only)"; ---- ./src/pathname.ml -+++ ./src/pathname.ml -@@ -84,6 +84,26 @@ - | x :: xs -> x :: normalize_list xs - - let normalize x = -+ let x = -+ if Sys.win32 = false then -+ x -+ else -+ let len = String.length x in -+ let b = Bytes.create len in -+ for i = 0 to pred len do -+ match x.[i] with -+ | '\\' -> Bytes.set b i '/' -+ | c -> Bytes.set b i c -+ done; -+ if len > 1 then ( -+ let c1 = Bytes.get b 0 in -+ let c2 = Bytes.get b 1 in -+ if c2 = ':' && c1 >= 'a' && c1 <= 'z' && -+ ( len = 2 || Bytes.get b 2 = '/') then -+ Bytes.set b 0 (Char.uppercase_ascii c1) -+ ); -+ Bytes.unsafe_to_string b -+ in - if Glob.eval not_normal_form_re x then - let root, paths = split x in - join root (normalize_list paths) ---- ./src/shell.ml -+++ ./src/shell.ml -@@ -24,12 +24,26 @@ - | 'a'..'z' | 'A'..'Z' | '0'..'9' | '.' | '-' | '/' | '_' | ':' | '@' | '+' | ',' -> loop (pos + 1) - | _ -> false in - loop 0 -+ -+let generic_quote quotequote s = -+ let l = String.length s in -+ let b = Buffer.create (l + 20) in -+ Buffer.add_char b '\''; -+ for i = 0 to l - 1 do -+ if s.[i] = '\'' -+ then Buffer.add_string b quotequote -+ else Buffer.add_char b s.[i] -+ done; -+ Buffer.add_char b '\''; -+ Buffer.contents b -+let unix_quote = generic_quote "'\\''" -+ - let quote_filename_if_needed s = - if is_simple_filename s then s - (* We should probably be using [Filename.unix_quote] except that function - * isn't exported. Users on Windows will have to live with not being able to - * install OCaml into c:\o'caml. Too bad. *) -- else if Sys.os_type = "Win32" then Printf.sprintf "'%s'" s -+ else if Sys.os_type = "Win32" then unix_quote s - else Filename.quote s - let chdir dir = - reset_filesys_cache (); -@@ -37,7 +51,7 @@ - let run args target = - reset_readdir_cache (); - let cmd = String.concat " " (List.map quote_filename_if_needed args) in -- if !*My_unix.is_degraded || Sys.os_type = "Win32" then -+ if !*My_unix.is_degraded then - begin - Log.event cmd target Tags.empty; - let st = sys_command cmd in diff --git a/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/package.json b/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/package.json deleted file mode 100644 index b24be7b..0000000 --- a/esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "build": [ - [ - "bash", - "-c", - "#{os == 'windows' ? 'patch -p1 < ocamlbuild-0.14.0.patch' : 'true'}" - ], - [ - "make", - "-f", - "configure.make", - "all", - "OCAMLBUILD_PREFIX=#{self.install}", - "OCAMLBUILD_BINDIR=#{self.bin}", - "OCAMLBUILD_LIBDIR=#{self.lib}", - "OCAMLBUILD_MANDIR=#{self.man}", - "OCAMLBUILD_NATIVE=true", - "OCAMLBUILD_NATIVE_TOOLS=true" - ], - [ - "make", - "check-if-preinstalled", - "all", - "#{os == 'windows' ? 'install' : 'opam-install'}" - ] - ] -} diff --git a/esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/files/findlib-1.8.1.patch b/esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/files/findlib-1.8.1.patch deleted file mode 100644 index 3e3ee5a..0000000 --- a/esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/files/findlib-1.8.1.patch +++ /dev/null @@ -1,471 +0,0 @@ ---- ./Makefile -+++ ./Makefile -@@ -57,16 +57,16 @@ - cat findlib.conf.in | \ - $(SH) tools/patch '@SITELIB@' '$(OCAML_SITELIB)' >findlib.conf - if ./tools/cmd_from_same_dir ocamlc; then \ -- echo 'ocamlc="ocamlc.opt"' >>findlib.conf; \ -+ echo 'ocamlc="ocamlc.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ - fi - if ./tools/cmd_from_same_dir ocamlopt; then \ -- echo 'ocamlopt="ocamlopt.opt"' >>findlib.conf; \ -+ echo 'ocamlopt="ocamlopt.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ - fi - if ./tools/cmd_from_same_dir ocamldep; then \ -- echo 'ocamldep="ocamldep.opt"' >>findlib.conf; \ -+ echo 'ocamldep="ocamldep.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ - fi - if ./tools/cmd_from_same_dir ocamldoc; then \ -- echo 'ocamldoc="ocamldoc.opt"' >>findlib.conf; \ -+ echo 'ocamldoc="ocamldoc.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ - fi - - .PHONY: install-doc ---- ./src/findlib/findlib_config.mlp -+++ ./src/findlib/findlib_config.mlp -@@ -24,3 +24,5 @@ - | "MacOS" -> "" (* don't know *) - | _ -> failwith "Unknown Sys.os_type" - ;; -+ -+let exec_suffix = "@EXEC_SUFFIX@";; ---- ./src/findlib/findlib.ml -+++ ./src/findlib/findlib.ml -@@ -28,15 +28,20 @@ - let conf_ldconf = ref "";; - let conf_ignore_dups_in = ref ([] : string list);; - --let ocamlc_default = "ocamlc";; --let ocamlopt_default = "ocamlopt";; --let ocamlcp_default = "ocamlcp";; --let ocamloptp_default = "ocamloptp";; --let ocamlmklib_default = "ocamlmklib";; --let ocamlmktop_default = "ocamlmktop";; --let ocamldep_default = "ocamldep";; --let ocamlbrowser_default = "ocamlbrowser";; --let ocamldoc_default = "ocamldoc";; -+let add_exec str = -+ match Findlib_config.exec_suffix with -+ | "" -> str -+ | a -> str ^ a ;; -+let ocamlc_default = add_exec "ocamlc";; -+let ocamlopt_default = add_exec "ocamlopt";; -+let ocamlcp_default = add_exec "ocamlcp";; -+let ocamloptp_default = add_exec "ocamloptp";; -+let ocamlmklib_default = add_exec "ocamlmklib";; -+let ocamlmktop_default = add_exec "ocamlmktop";; -+let ocamldep_default = add_exec "ocamldep";; -+let ocamlbrowser_default = add_exec "ocamlbrowser";; -+let ocamldoc_default = add_exec "ocamldoc";; -+ - - - let init_manually ---- ./src/findlib/fl_package_base.ml -+++ ./src/findlib/fl_package_base.ml -@@ -133,7 +133,15 @@ - List.find (fun def -> def.def_var = "exists_if") p.package_defs in - let files = Fl_split.in_words def.def_value in - List.exists -- (fun file -> Sys.file_exists (Filename.concat d' file)) -+ (fun file -> -+ let fln = Filename.concat d' file in -+ let e = Sys.file_exists fln in -+ (* necessary for ppx executables *) -+ if e || Sys.os_type <> "Win32" || Filename.check_suffix fln ".exe" then -+ e -+ else -+ Sys.file_exists (fln ^ ".exe") -+ ) - files - with Not_found -> true in - ---- ./src/findlib/fl_split.ml -+++ ./src/findlib/fl_split.ml -@@ -126,10 +126,17 @@ - | '/' | '\\' -> true - | _ -> false in - let norm_dir_win() = -- if l >= 1 && s.[0] = '/' then -- Buffer.add_char b '\\' else Buffer.add_char b s.[0]; -- if l >= 2 && s.[1] = '/' then -- Buffer.add_char b '\\' else Buffer.add_char b s.[1]; -+ if l >= 1 then ( -+ if s.[0] = '/' then -+ Buffer.add_char b '\\' -+ else -+ Buffer.add_char b s.[0] ; -+ if l >= 2 then -+ if s.[1] = '/' then -+ Buffer.add_char b '\\' -+ else -+ Buffer.add_char b s.[1]; -+ ); - for k = 2 to l - 1 do - let c = s.[k] in - if is_slash c then ( ---- ./src/findlib/frontend.ml -+++ ./src/findlib/frontend.ml -@@ -31,10 +31,18 @@ - else - Sys_error (arg ^ ": " ^ Unix.error_message code) - -+let is_win = Sys.os_type = "Win32" -+ -+let () = -+ match Findlib_config.system with -+ | "win32" | "win64" | "mingw" | "cygwin" | "mingw64" | "cygwin64" -> -+ (try set_binary_mode_out stdout true with _ -> ()); -+ (try set_binary_mode_out stderr true with _ -> ()); -+ | _ -> () - - let slashify s = - match Findlib_config.system with -- | "mingw" | "mingw64" | "cygwin" -> -+ | "win32" | "win64" | "mingw" | "cygwin" | "mingw64" | "cygwin64" -> - let b = Buffer.create 80 in - String.iter - (function -@@ -49,7 +57,7 @@ - - let out_path ?(prefix="") s = - match Findlib_config.system with -- | "mingw" | "mingw64" | "cygwin" -> -+ | "win32" | "win64" | "mingw" | "mingw64" | "cygwin" -> - let u = slashify s in - prefix ^ - (if String.contains u ' ' then -@@ -273,11 +281,9 @@ - - - let identify_dir d = -- match Sys.os_type with -- | "Win32" -> -- failwith "identify_dir" (* not available *) -- | _ -> -- let s = Unix.stat d in -+ if is_win then -+ failwith "identify_dir"; (* not available *) -+ let s = Unix.stat d in - (s.Unix.st_dev, s.Unix.st_ino) - ;; - -@@ -459,6 +465,96 @@ - ) - packages - -+let rewrite_cmd s = -+ if s = "" || not is_win then -+ s -+ else -+ let s = -+ let l = String.length s in -+ let b = Buffer.create l in -+ for i = 0 to pred l do -+ match s.[i] with -+ | '/' -> Buffer.add_char b '\\' -+ | x -> Buffer.add_char b x -+ done; -+ Buffer.contents b -+ in -+ if (Filename.is_implicit s && String.contains s '\\' = false) || -+ Filename.check_suffix (String.lowercase s) ".exe" then -+ s -+ else -+ let s' = s ^ ".exe" in -+ if Sys.file_exists s' then -+ s' -+ else -+ s -+ -+let rewrite_cmd s = -+ if s = "" || not is_win then s else -+ let s = -+ let l = String.length s in -+ let b = Buffer.create l in -+ for i = 0 to pred l do -+ match s.[i] with -+ | '/' -> Buffer.add_char b '\\' -+ | x -> Buffer.add_char b x -+ done; -+ Buffer.contents b -+ in -+ if (Filename.is_implicit s && String.contains s '\\' = false) || -+ Filename.check_suffix (String.lowercase s) ".exe" then -+ s -+ else -+ let s' = s ^ ".exe" in -+ if Sys.file_exists s' then -+ s' -+ else -+ s -+ -+let rewrite_pp cmd = -+ if not is_win then cmd else -+ let module T = struct exception Keep end in -+ let is_whitespace = function -+ | ' ' | '\011' | '\012' | '\n' | '\r' | '\t' -> true -+ | _ -> false in -+ (* characters that triggers special behaviour (cmd.exe, not unix shell) *) -+ let is_unsafe_char = function -+ | '(' | ')' | '%' | '!' | '^' | '<' | '>' | '&' -> true -+ | _ -> false in -+ let len = String.length cmd in -+ let buf = Buffer.create (len + 4) in -+ let buf_cmd = Buffer.create len in -+ let rec iter_ws i = -+ if i >= len then () else -+ let cur = cmd.[i] in -+ if is_whitespace cur then ( -+ Buffer.add_char buf cur; -+ iter_ws (succ i) -+ ) -+ else -+ iter_cmd i -+ and iter_cmd i = -+ if i >= len then add_buf_cmd () else -+ let cur = cmd.[i] in -+ if is_unsafe_char cur || cur = '"' || cur = '\'' then -+ raise T.Keep; -+ if is_whitespace cur then ( -+ add_buf_cmd (); -+ Buffer.add_substring buf cmd i (len - i) -+ ) -+ else ( -+ Buffer.add_char buf_cmd cur; -+ iter_cmd (succ i) -+ ) -+ and add_buf_cmd () = -+ if Buffer.length buf_cmd > 0 then -+ Buffer.add_string buf (rewrite_cmd (Buffer.contents buf_cmd)) -+ in -+ try -+ iter_ws 0; -+ Buffer.contents buf -+ with -+ | T.Keep -> cmd - - let process_pp_spec syntax_preds packages pp_opts = - (* Returns: pp_command *) -@@ -549,7 +645,7 @@ - None -> [] - | Some cmd -> - ["-pp"; -- cmd ^ " " ^ -+ (rewrite_cmd cmd) ^ " " ^ - String.concat " " (List.map Filename.quote pp_i_options) ^ " " ^ - String.concat " " (List.map Filename.quote pp_archives) ^ " " ^ - String.concat " " (List.map Filename.quote pp_opts)] -@@ -625,9 +721,11 @@ - in - try - let preprocessor = -+ rewrite_cmd ( - resolve_path - ~base ~explicit:true -- (package_property predicates pname "ppx") in -+ (package_property predicates pname "ppx") ) -+ in - ["-ppx"; String.concat " " (preprocessor :: options)] - with Not_found -> [] - ) -@@ -895,6 +993,14 @@ - switch (e.g. -L instead of -L ) - *) - -+(* We may need to remove files on which we do not have complete control. -+ On Windows, removing a read-only file fails so try to change the -+ mode of the file first. *) -+let remove_file fname = -+ try Sys.remove fname -+ with Sys_error _ when is_win -> -+ (try Unix.chmod fname 0o666 with Unix.Unix_error _ -> ()); -+ Sys.remove fname - - let ocamlc which () = - -@@ -1022,9 +1128,12 @@ - - "-intf", - Arg.String (fun s -> pass_files := !pass_files @ [ Intf(slashify s) ]); -- -+ - "-pp", -- Arg.String (fun s -> pp_specified := true; add_spec_fn "-pp" s); -+ Arg.String (fun s -> pp_specified := true; add_spec_fn "-pp" (rewrite_pp s)); -+ -+ "-ppx", -+ Arg.String (fun s -> add_spec_fn "-ppx" (rewrite_pp s)); - - "-thread", - Arg.Unit (fun _ -> threads := threads_default); -@@ -1237,7 +1346,7 @@ - with - any -> - close_out initl; -- Sys.remove initl_file_name; -+ remove_file initl_file_name; - raise any - end; - -@@ -1245,9 +1354,9 @@ - at_exit - (fun () -> - let tr f x = try f x with _ -> () in -- tr Sys.remove initl_file_name; -- tr Sys.remove (Filename.chop_extension initl_file_name ^ ".cmi"); -- tr Sys.remove (Filename.chop_extension initl_file_name ^ ".cmo"); -+ tr remove_file initl_file_name; -+ tr remove_file (Filename.chop_extension initl_file_name ^ ".cmi"); -+ tr remove_file (Filename.chop_extension initl_file_name ^ ".cmo"); - ); - - let exclude_list = [ stdlibdir; threads_dir; vmthreads_dir ] in -@@ -1493,7 +1602,9 @@ - [ "-v", Arg.Unit (fun () -> verbose := Verbose); - "-pp", Arg.String (fun s -> - pp_specified := true; -- options := !options @ ["-pp"; s]); -+ options := !options @ ["-pp"; rewrite_pp s]); -+ "-ppx", Arg.String (fun s -> -+ options := !options @ ["-ppx"; rewrite_pp s]); - ] - ) - ) -@@ -1672,7 +1783,9 @@ - Arg.String (fun s -> add_spec_fn "-I" (slashify (resolve_path s))); - - "-pp", Arg.String (fun s -> pp_specified := true; -- add_spec_fn "-pp" s); -+ add_spec_fn "-pp" (rewrite_pp s)); -+ "-ppx", Arg.String (fun s -> add_spec_fn "-ppx" (rewrite_pp s)); -+ - ] - ) - ) -@@ -1830,7 +1943,10 @@ - output_string ch_out append; - close_out ch_out; - close_in ch_in; -- Unix.utimes outpath s.Unix.st_mtime s.Unix.st_mtime; -+ (try Unix.utimes outpath s.Unix.st_mtime s.Unix.st_mtime -+ with Unix.Unix_error(e,_,_) -> -+ prerr_endline("Warning: setting utimes for " ^ outpath -+ ^ ": " ^ Unix.error_message e)); - - prerr_endline("Installed " ^ outpath); - with -@@ -1882,6 +1998,8 @@ - Unix.openfile (Filename.concat dir owner_file) [Unix.O_RDONLY] 0 in - let f = - Unix.in_channel_of_descr fd in -+ if is_win then -+ set_binary_mode_in f false; - try - let line = input_line f in - let is_my_file = (line = pkg) in -@@ -2208,7 +2326,7 @@ - let lines = read_ldconf !ldconf in - let dlldir_norm = Fl_split.norm_dir dlldir in - let dlldir_norm_lc = string_lowercase_ascii dlldir_norm in -- let ci_filesys = (Sys.os_type = "Win32") in -+ let ci_filesys = is_win in - let check_dir d = - let d' = Fl_split.norm_dir d in - (d' = dlldir_norm) || -@@ -2356,7 +2474,7 @@ - List.iter - (fun file -> - let absfile = Filename.concat dlldir file in -- Sys.remove absfile; -+ remove_file absfile; - prerr_endline ("Removed " ^ absfile) - ) - dll_files -@@ -2365,7 +2483,7 @@ - (* Remove the files from the package directory: *) - if Sys.file_exists pkgdir then begin - let files = Sys.readdir pkgdir in -- Array.iter (fun f -> Sys.remove (Filename.concat pkgdir f)) files; -+ Array.iter (fun f -> remove_file (Filename.concat pkgdir f)) files; - Unix.rmdir pkgdir; - prerr_endline ("Removed " ^ pkgdir) - end -@@ -2415,7 +2533,9 @@ - - - let print_configuration() = -+ let sl = slashify in - let dir s = -+ let s = sl s in - if Sys.file_exists s then - s - else -@@ -2453,27 +2573,27 @@ - if md = "" then "the corresponding package directories" else dir md - ); - Printf.printf "The standard library is assumed to reside in:\n %s\n" -- (Findlib.ocaml_stdlib()); -+ (sl (Findlib.ocaml_stdlib())); - Printf.printf "The ld.conf file can be found here:\n %s\n" -- (Findlib.ocaml_ldconf()); -+ (sl (Findlib.ocaml_ldconf())); - flush stdout - | Some "conf" -> -- print_endline (Findlib.config_file()) -+ print_endline (sl (Findlib.config_file())) - | Some "path" -> -- List.iter print_endline (Findlib.search_path()) -+ List.iter ( fun x -> print_endline (sl x)) (Findlib.search_path()) - | Some "destdir" -> -- print_endline (Findlib.default_location()) -+ print_endline ( sl (Findlib.default_location())) - | Some "metadir" -> -- print_endline (Findlib.meta_directory()) -+ print_endline ( sl (Findlib.meta_directory())) - | Some "metapath" -> - let mdir = Findlib.meta_directory() in - let ddir = Findlib.default_location() in -- print_endline -- (if mdir <> "" then mdir ^ "/META.%s" else ddir ^ "/%s/META") -+ print_endline ( sl -+ (if mdir <> "" then mdir ^ "/META.%s" else ddir ^ "/%s/META")) - | Some "stdlib" -> -- print_endline (Findlib.ocaml_stdlib()) -+ print_endline ( sl (Findlib.ocaml_stdlib())) - | Some "ldconf" -> -- print_endline (Findlib.ocaml_ldconf()) -+ print_endline ( sl (Findlib.ocaml_ldconf())) - | _ -> - assert false - ;; -@@ -2481,7 +2601,7 @@ - - let ocamlcall pkg cmd = - let dir = package_directory pkg in -- let path = Filename.concat dir cmd in -+ let path = rewrite_cmd (Filename.concat dir cmd) in - begin - try Unix.access path [ Unix.X_OK ] - with -@@ -2647,6 +2767,10 @@ - | Sys_error f -> - prerr_endline ("ocamlfind: " ^ f); - exit 2 -+ | Unix.Unix_error (e, fn, f) -> -+ prerr_endline ("ocamlfind: " ^ fn ^ " " ^ f -+ ^ ": " ^ Unix.error_message e); -+ exit 2 - | Findlib.No_such_package(pkg,info) -> - prerr_endline ("ocamlfind: Package `" ^ pkg ^ "' not found" ^ - (if info <> "" then " - " ^ info else "")); ---- ./src/findlib/Makefile -+++ ./src/findlib/Makefile -@@ -90,6 +90,7 @@ - cat findlib_config.mlp | \ - $(SH) $(TOP)/tools/patch '@CONFIGFILE@' '$(OCAMLFIND_CONF)' | \ - $(SH) $(TOP)/tools/patch '@STDLIB@' '$(OCAML_CORE_STDLIB)' | \ -+ $(SH) $(TOP)/tools/patch '@EXEC_SUFFIX@' '$(EXEC_SUFFIX)' | \ - sed -e 's;@AUTOLINK@;$(OCAML_AUTOLINK);g' \ - -e 's;@SYSTEM@;$(SYSTEM);g' \ - >findlib_config.ml diff --git a/esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/package.json b/esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/package.json deleted file mode 100644 index 9314f87..0000000 --- a/esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "build": [ - [ - "bash", - "-c", - "#{os == 'windows' ? 'patch -p1 < findlib-1.8.1.patch' : 'true'}" - ], - [ - "./configure", - "-bindir", - "#{self.bin}", - "-sitelib", - "#{self.lib}", - "-mandir", - "#{self.man}", - "-config", - "#{self.lib}/findlib.conf", - "-no-custom", - "-no-topfind" - ], - [ - "make", - "all" - ], - [ - "make", - "opt" - ] - ], - "install": [ - [ - "make", - "install" - ], - [ - "install", - "-m", - "0755", - "ocaml-stub", - "#{self.bin}/ocaml" - ], - [ - "mkdir", - "-p", - "#{self.toplevel}" - ], - [ - "install", - "-m", - "0644", - "src/findlib/topfind", - "#{self.toplevel}/topfind" - ] - ], - "exportedEnv": { - "OCAML_TOPLEVEL_PATH": { - "val": "#{self.toplevel}", - "scope": "global" - } - } -} diff --git a/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/files/customer-cclib.patch b/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/files/customer-cclib.patch deleted file mode 100644 index e78b0df..0000000 --- a/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/files/customer-cclib.patch +++ /dev/null @@ -1,22 +0,0 @@ -From d51b3f3a49f159469e00d23524db915f19bb0127 Mon Sep 17 00:00:00 2001 -From: Hannes Mehnert -Date: Tue, 3 Oct 2017 13:55:16 +0100 -Subject: [PATCH] bytecode / custom needs -cclib as well - ---- - src/ocb_stubblr.ml | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/ocb_stubblr.ml b/src/ocb_stubblr.ml -index b68c37a..a0ee035 100644 ---- a/src/ocb_stubblr.ml -+++ b/src/ocb_stubblr.ml -@@ -160,7 +160,7 @@ let link_flag () = - S [A switch; A ("-l"^name)] - and dep flag = Pathname.([remove_extension flag -.- "a"]) in - pflag ["link"; "ocaml"; "library"; "byte"] tag (libarg "-dllib"); -- pflag ["link"; "ocaml"; "library"; "native"] tag (libarg "-cclib"); -+ pflag ["link"; "ocaml"; "library"] tag (libarg "-cclib"); - pdep ["link"; "ocaml"] tag dep; - pdep ["compile"; "ocaml"] tag dep - (* XXX sneak in '-I' for compile;ocaml;program ?? *) diff --git a/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/files/ocb-stubblr-0.1.1.patch b/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/files/ocb-stubblr-0.1.1.patch deleted file mode 100644 index 1f763f3..0000000 --- a/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/files/ocb-stubblr-0.1.1.patch +++ /dev/null @@ -1,31 +0,0 @@ ---- ./src/ocb_stubblr.ml -+++ ./src/ocb_stubblr.ml -@@ -158,7 +158,7 @@ - let name = Pathname.(remove_extension clib |> basename) in - let name = String.(if is_prefix ~affix:"lib" name then drop ~max:3 name else name) in - S [A switch; A ("-l"^name)] -- and dep flag = Pathname.([remove_extension flag -.- "a"]) in -+ and dep flag = Pathname.([remove_extension flag -.- !Options.ext_lib]) in - pflag ["link"; "ocaml"; "library"; "byte"] tag (libarg "-dllib"); - pflag ["link"; "ocaml"; "library"; "native"] tag (libarg "-cclib"); - pdep ["link"; "ocaml"] tag dep; -@@ -174,9 +174,18 @@ - let c = env c and deps = env deps in - let to_list str = List.filter ((<>) "\\") @@ - String.fields ~empty:false ~is_sep:Char.Ascii.is_white str in -+ let cc = -+ (* very dirty, no msvc support *) -+ if Sys.os_type <> "Win32" then -+ "cc" -+ else if Sys.word_size = 64 then -+ "x86_64-w64-mingw32-gcc" -+ else -+ "i686-w64-mingw32-gcc" -+ in - let cmd = Cmd ( - S [ A "cd"; P root; Sh "&&"; -- A "cc"; T (tags_of_pathname c); A "-MM"; A "-MG"; P c ]) in -+ A cc; T (tags_of_pathname c); A "-MM"; A "-MG"; P c ]) in - let headers = match Command.to_string cmd |> run_and_read |> to_list with - | _::_::xs -> List.map (fun p -> Pathname.normalize p ^ "\n") xs - | _ -> error_exit_msgf "%s: depends: unrecognized format" c in diff --git a/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/files/use-OPAM_SWITCH_PREFIX.patch b/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/files/use-OPAM_SWITCH_PREFIX.patch deleted file mode 100644 index dfb32a3..0000000 --- a/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/files/use-OPAM_SWITCH_PREFIX.patch +++ /dev/null @@ -1,33 +0,0 @@ -From f1c9340f3ab973ad1e8dcc4b7065bbe6cfaa028f Mon Sep 17 00:00:00 2001 -From: David Allsopp -Date: Sun, 1 Jul 2018 09:54:32 +0100 -Subject: [PATCH] Use OPAM_SWITCH_PREFIX before opam config var prefix - -opam 2's sandbox doesn't expose the mount point for the opam root. - -Signed-off-by: David Allsopp ---- - src/ocb_stubblr.ml | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/src/ocb_stubblr.ml b/src/ocb_stubblr.ml -index b68c37a..2cc5332 100644 ---- a/src/ocb_stubblr.ml -+++ b/src/ocb_stubblr.ml -@@ -31,11 +31,15 @@ module Pkg_config = struct - - (* XXX Would be nice to move pkg-config results to a build artefact. *) - -- let opam_prefix = -+ let opam_prefix_cmd = - let cmd = "opam config var prefix" in - lazy ( try run_and_read cmd with Failure _ -> - error_msgf "error running opam") - -+ let opam_prefix = -+ lazy (try Sys.getenv "OPAM_SWITCH_PREFIX" -+ with Not_found -> Lazy.force opam_prefix_cmd) -+ - let var = "PKG_CONFIG_PATH" - - let path () = \ No newline at end of file diff --git a/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/package.json b/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/package.json deleted file mode 100644 index 66492dd..0000000 --- a/esy.lock/overrides/opam__s__ocb_stubblr_opam__c__0.1.1_1_opam_override/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "build": [ - "#{os == 'windows' ? 'patch --strip 1 --input ocb-stubblr-0.1.1.patch' : 'true'}", - [ - "ocaml", - "pkg/pkg.ml", - "build", - "--pinned", - "false", - "--tests", - "false" - ] - ], - "dependencies": { - "@esy-ocaml/fauxpam": "0.2.0" - } -} diff --git a/esy.lock/overrides/opam__s__ocplib_endian_opam__c__1.0_opam_override/files/esy-fix.patch b/esy.lock/overrides/opam__s__ocplib_endian_opam__c__1.0_opam_override/files/esy-fix.patch deleted file mode 100644 index b9e945a..0000000 --- a/esy.lock/overrides/opam__s__ocplib_endian_opam__c__1.0_opam_override/files/esy-fix.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- ./setup.ml -+++ ./setup.ml -@@ -6331,9 +6331,7 @@ - [ - "-classic-display"; - "-no-log"; -- "-no-links"; -- "-install-lib-dir"; -- (Filename.concat (standard_library ()) "ocamlbuild") -+ "-no-links" - ] - else - []; diff --git a/esy.lock/overrides/opam__s__ocplib_endian_opam__c__1.0_opam_override/files/ocplib-endian-0.8.patch b/esy.lock/overrides/opam__s__ocplib_endian_opam__c__1.0_opam_override/files/ocplib-endian-0.8.patch deleted file mode 100644 index 7cafa0d..0000000 --- a/esy.lock/overrides/opam__s__ocplib_endian_opam__c__1.0_opam_override/files/ocplib-endian-0.8.patch +++ /dev/null @@ -1,41 +0,0 @@ ---- ./myocamlbuild.ml -+++ ./myocamlbuild.ml -@@ -573,6 +573,24 @@ - Add a dependency after dropping support for 4.01 and earlier. *) - let dispatch_cppo = function - | After_rules -> begin -+ let is_directory s = -+ let slen = String.length s in -+ let s = -+ if Sys.os_type <> "Win32" || slen < 2 then -+ s -+ else -+ match s.[slen-1] with -+ | '\\' | '/' -> -+ if slen <> 3 || s.[1] <> ':' then -+ String.sub s 0 (slen -1) -+ else -+ (match s.[0] with -+ | 'A' .. 'Z' | 'a' .. 'z' -> s -+ | _ -> String.sub s 0 (slen -1)) -+ | _ -> s -+ in -+ Pathname.is_directory s -+ in - let cppo_rules ext = - let dep = "%(name).cppo"-.-ext - and prod1 = "%(name: <*> and not <*.cppo>)"-.-ext -@@ -591,11 +609,11 @@ - pflag ["cppo"] "cppo_D" (fun s -> S [A "-D"; A s]) ; - pflag ["cppo"] "cppo_U" (fun s -> S [A "-U"; A s]) ; - pflag ["cppo"] "cppo_I" (fun s -> -- if Pathname.is_directory s then S [A "-I"; P s] -+ if is_directory s then S [A "-I"; P s] - else S [A "-I"; P (Pathname.dirname s)] - ) ; - pdep ["cppo"] "cppo_I" (fun s -> -- if Pathname.is_directory s then [] else [s]) ; -+ if is_directory s then [] else [s]) ; - flag ["cppo"; "cppo_q"] (A "-q") ; - flag ["cppo"; "cppo_s"] (A "-s") ; - flag ["cppo"; "cppo_n"] (A "-n") ; diff --git a/esy.lock/overrides/opam__s__ocplib_endian_opam__c__1.0_opam_override/package.json b/esy.lock/overrides/opam__s__ocplib_endian_opam__c__1.0_opam_override/package.json deleted file mode 100644 index 86ea38b..0000000 --- a/esy.lock/overrides/opam__s__ocplib_endian_opam__c__1.0_opam_override/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "build": [ - [ - "bash", - "-c", - "#{os == 'windows' ? 'patch -p1 < ocplib-endian-0.8.patch' : 'true'}" - ], - [ - "bash", - "-c", - "#{os == 'windows' ? 'patch -p1 < esy-fix.patch' : 'true'}" - ], - [ - "ocaml", - "setup.ml", - "-configure", - "--disable-debug", - "--prefix", - "#{self.install}" - ], - [ - "ocaml", - "setup.ml", - "-build" - ] - ], - "install": [ - [ - "ocaml", - "setup.ml", - "-install" - ] - ] -} diff --git a/esy.lock/overrides/opam__s__zarith_opam__c__1.9.1_opam_override/package.json b/esy.lock/overrides/opam__s__zarith_opam__c__1.9.1_opam_override/package.json deleted file mode 100644 index 7fa37ee..0000000 --- a/esy.lock/overrides/opam__s__zarith_opam__c__1.9.1_opam_override/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "exportedEnv": { - "CAML_LD_LIBRARY_PATH": { - "val": "#{self.lib / 'zarith' : $CAML_LD_LIBRARY_PATH}", - "scope": "global" - } - } -} diff --git a/executable/Alias.re b/executable/Alias.re deleted file mode 100644 index d631e52..0000000 --- a/executable/Alias.re +++ /dev/null @@ -1,37 +0,0 @@ -open Fnm; - -let run = (~name, ~version) => { - let version = Versions.format(version); - let%lwt matchingLocalVersions = - LocalVersionResolver.getMatchingLocalVersions(version); - - switch (Base.List.hd(matchingLocalVersions)) { - | Some(latestMatchingLocalVersion) => - Logger.info( - - "Aliasing " - name - " to " - {latestMatchingLocalVersion.name} - , - ); - - let%lwt () = - Versions.Aliases.set( - ~alias=name, - ~versionPath= - Filename.concat( - latestMatchingLocalVersion.fullPath, - "installation", - ), - ); - Lwt.return_ok(); - | None => - Logger.error( - - "No installed versions found that match your criteria." - , - ); - Lwt.return_error(1); - }; -}; diff --git a/executable/Current.re b/executable/Current.re deleted file mode 100644 index dcac705..0000000 --- a/executable/Current.re +++ /dev/null @@ -1,11 +0,0 @@ -open Fnm; - -let run = () => { - let%lwt currentVersion = Versions.getCurrentVersion(); - switch (currentVersion) { - | Some({name}) => Console.log(name) - | _ => Console.log("none") - }; - - Lwt.return_ok(); -}; diff --git a/executable/Env.re b/executable/Env.re deleted file mode 100644 index a9fb881..0000000 --- a/executable/Env.re +++ /dev/null @@ -1,163 +0,0 @@ -open Fnm; - -module ExportShellVarCmdGetters = { - type exportCmdGetter = { - getPathCmd: string => string, - getMultiShellPathCmd: string => string, - getFnmDirCmd: string => string, - getNodeDistMirrorCmd: string => string, - getLogLevelCmd: string => string, - }; - - let posixExportCmdGetter: exportCmdGetter = { - getPathCmd: path => Printf.sprintf("export PATH=%s/bin:$PATH", path), - - getMultiShellPathCmd: path => - Printf.sprintf("export %s=%s", Config.FNM_MULTISHELL_PATH.name, path), - - getFnmDirCmd: fnmDir => - Printf.sprintf("export %s=%s", Config.FNM_DIR.name, fnmDir), - - getNodeDistMirrorCmd: nodeDistMirror => - Printf.sprintf( - "export %s=%s", - Config.FNM_NODE_DIST_MIRROR.name, - nodeDistMirror, - ), - - getLogLevelCmd: logLevel => - Printf.sprintf("export %s=%s", Config.FNM_LOGLEVEL.name, logLevel), - }; - - let fishExportCmdGetter: exportCmdGetter = { - getPathCmd: path => Printf.sprintf("set -gx PATH %s/bin $PATH;", path), - - getMultiShellPathCmd: path => - Printf.sprintf("set -gx %s %s;", Config.FNM_MULTISHELL_PATH.name, path), - - getFnmDirCmd: fnmDir => - Printf.sprintf("set -gx %s %s;", Config.FNM_DIR.name, fnmDir), - - getNodeDistMirrorCmd: nodeDistMirror => - Printf.sprintf( - "set -gx %s %s", - Config.FNM_NODE_DIST_MIRROR.name, - nodeDistMirror, - ), - - getLogLevelCmd: logLevel => - Printf.sprintf("set -gx %s %s", Config.FNM_LOGLEVEL.name, logLevel), - }; -}; - -let symlinkExists = path => - try%lwt(Lwt_unix.lstat(path) |> Lwt.map(_ => true)) { - | _ => Lwt.return(false) - }; - -let rec makeTemporarySymlink = () => { - let suggestedName = - Filename.concat( - Filename.get_temp_dir_name(), - "fnm-shell-" - ++ (Random.int32(9999999 |> Int32.of_int) |> Int32.to_string), - ); - - let%lwt exists = symlinkExists(suggestedName); - - if (exists) { - let%lwt suggestedName = makeTemporarySymlink(); - Lwt.return(suggestedName); - } else { - let%lwt _ = Lwt_unix.symlink(Directories.defaultVersion, suggestedName); - Lwt.return(suggestedName); - }; -}; - -let printUseOnCd = (~shell) => - switch (shell) { - | System.Shell.Bash => {| - __fnmcd () { - cd "$@" - - if [[ -f .node-version && -r .node-version ]]; then - echo "fnm: Found .node-version" - fnm use - elif [[ -f .nvmrc && -r .nvmrc ]]; then - echo "fnm: Found .nvmrc" - fnm use - fi - } - - alias cd=__fnmcd - |} - | Fish => {| - function _fnm_autoload_hook --on-variable PWD --description 'Change Node version on directory change' - status --is-command-substitution; and return - if test -f .node-version - echo "fnm: Found .node-version" - fnm use - else if test -f .nvmrc - echo "fnm: Found .nvmrc" - fnm use - end - end - _fnm_autoload_hook - |} - | Zsh => {| - autoload -U add-zsh-hook - _fnm_autoload_hook () { - if [[ -f .node-version && -r .node-version ]]; then - echo "fnm: Found .node-version" - fnm use - elif [[ -f .nvmrc && -r .nvmrc ]]; then - echo "fnm: Found .nvmrc" - fnm use - fi - } - - add-zsh-hook chpwd _fnm_autoload_hook \ - && _fnm_autoload_hook - |} - }; - -let run = - (~forceShell, ~multishell, ~nodeDistMirror, ~fnmDir, ~useOnCd, ~logLevel) => { - open System.Shell; - - let%lwt shell = - switch (forceShell) { - | None => - switch%lwt (System.Shell.infer()) { - | None => Lwt.return(Bash) - | Some(shell) => Lwt.return(shell) - } - | Some(shell) => Lwt.return(shell) - }; - - Random.self_init(); - - let%lwt path = - multishell - ? makeTemporarySymlink() : Lwt.return(Directories.globalCurrentVersion); - - let exportCmdGetter = - shell === Fish - ? ExportShellVarCmdGetters.fishExportCmdGetter - : ExportShellVarCmdGetters.posixExportCmdGetter; - - exportCmdGetter.getPathCmd(path) |> Console.log; - exportCmdGetter.getMultiShellPathCmd(path) |> Console.log; - exportCmdGetter.getFnmDirCmd(fnmDir) |> Console.log; - exportCmdGetter.getNodeDistMirrorCmd(nodeDistMirror) |> Console.log; - - Fnm.LogLevel.toString(logLevel) - |> exportCmdGetter.getLogLevelCmd - |> Console.log; - - if (useOnCd) { - printUseOnCd(~shell) |> Console.log; - }; - - Lwt.return_ok(); -}; diff --git a/executable/Exec.re b/executable/Exec.re deleted file mode 100644 index 6a2667c..0000000 --- a/executable/Exec.re +++ /dev/null @@ -1,93 +0,0 @@ -open Fnm; - -exception System_Version_Not_Supported; -exception Ambiguous_Arguments; - -let startsWith = (~prefix, str) => - Base.String.prefix(str, String.length(prefix)) != prefix; - -let unsafeRun = (~cmd, ~version as maybeVersion, ~useFileVersion) => { - let%lwt version = - switch (maybeVersion, useFileVersion) { - | (None, false) => Lwt.return_none - | (Some(_), true) => Lwt.fail(Ambiguous_Arguments) - | (None, true) => Fnm.Dotfiles.getVersion() |> Lwt.map(x => Some(x)) - | (Some(version), false) => Lwt.return_some(version) - }; - let%lwt currentVersion = - switch (version) { - | None => Lwt.return(Directories.currentVersion) - | Some(version) => - let%lwt matchingVersion = LocalVersionResolver.getVersion(version); - let matchingVersionPath = - switch (matchingVersion) { - | Alias(path) => Versions.Aliases.toDirectory(path) - | Local(path) => Versions.Local.toDirectory(path) - | System => raise(System_Version_Not_Supported) - }; - Lwt.return(matchingVersionPath); - }; - let fnmPath = Filename.concat(currentVersion, "bin"); - let path = Opt.(Sys.getenv_opt("PATH") or ""); - let pathEnv = Printf.sprintf("PATH=%s:%s", fnmPath, path); - let cmd = cmd |> Array.copy |> Array.append([|"env", pathEnv|]); - let%lwt exitCode = - Lwt_process.exec( - ~stdin=`Keep, - ~stdout=`Keep, - ~stderr=`Keep, - ~env=Unix.environment(), - ("", cmd), - ); - - switch (exitCode) { - | Unix.WEXITED(0) => Lwt.return_ok() - | Unix.WEXITED(x) - | Unix.WSTOPPED(x) - | Unix.WSIGNALED(x) => Lwt.return_error(x) - }; -}; - -let run = (~cmd, ~version, ~useFileVersion) => { - try%lwt(unsafeRun(~cmd, ~version, ~useFileVersion)) { - | Ambiguous_Arguments => - Console.error( - - "Error: " - "You passed both " - "--using" - " and " - "--using-file" - ".\n" - "Please provide only one of them." - , - ); - Lwt.return_error(1); - | System_Version_Not_Supported => - Console.error( - - "Error: " - "System version is not supported in " - "`fnm exec`" - , - ); - Lwt.return_error(1); - | LocalVersionResolver.Version_Not_Installed(versionName) => - Console.error( - - "Error: " - "Version " - versionName - " is not installed." - , - ); - Lwt.return_error(1); - | Dotfiles.Version_Not_Provided => - Console.error( - - "No .nvmrc or .node-version file was found in the current directory. Please provide a version number." - , - ); - Lwt.return_error(1); - }; -}; diff --git a/executable/FnmApp.re b/executable/FnmApp.re deleted file mode 100644 index 5f64b29..0000000 --- a/executable/FnmApp.re +++ /dev/null @@ -1,451 +0,0 @@ -let version = Fnm.Fnm__Package.version; - -let runCmd = lwt => { - lwt - |> Lwt_main.run - |> ( - fun - | Error(err_code) => exit(err_code) - | Ok () => () - ); -}; - -module Commands = { - let exec = (version, useFileVersion, cmd) => - Exec.run(~cmd=Array.of_list(cmd), ~version, ~useFileVersion) |> runCmd; - let use = (version, quiet) => Use.run(~version, ~quiet) |> runCmd; - let current = () => Current.run() |> runCmd; - let alias = (version, name) => Alias.run(~name, ~version) |> runCmd; - let default = version => Alias.run(~name="default", ~version) |> runCmd; - let listRemote = version => ListRemote.run(~version) |> runCmd; - let listLocal = () => ListLocal.run() |> runCmd; - let install = version => Install.run(~version) |> runCmd; - let uninstall = version => Uninstall.run(~version) |> runCmd; - let env = - ( - isFishShell, - isMultishell, - nodeDistMirror, - fnmDir, - shell, - useOnCd, - logLevel, - ) => - Env.run( - ~forceShell=Fnm.System.Shell.(isFishShell ? Some(Fish) : shell), - ~multishell=isMultishell, - ~nodeDistMirror, - ~fnmDir, - ~useOnCd, - ~logLevel, - ) - |> runCmd; -}; - -open Cmdliner; - -let help_secs = [ - `S(Manpage.s_common_options), - `S(Manpage.s_environment), - `P("These options are common to all commands."), - `S("MORE HELP"), - `P("Use `$(mname) $(i,COMMAND) --help' for help on a single command."), - `Noblank, - `S(Manpage.s_bugs), - `P("File bug reports at https://github.com/Schniz/fnm"), -]; - -let envs = - Fnm.Config.getDocs() - |> List.map(envVar => - Fnm.Config.( - Term.env_info( - ~doc= - Printf.sprintf( - "%s\ndefaults to \"%s\"", - envVar.doc, - envVar.default, - ), - envVar.name, - ) - ) - ); - -let install = { - let doc = "Install another node version"; - let man = help_secs; - let sdocs = Manpage.s_common_options; - - let selectedVersion = { - let doc = "Install another version specified in $(docv)."; - Arg.( - value & pos(0, some(string), None) & info([], ~docv="VERSION", ~doc) - ); - }; - - ( - Term.(const(Commands.install) $ selectedVersion), - Term.info( - "install", - ~envs, - ~version, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let uninstall = { - let doc = "Uninstall a node version"; - let sdocs = Manpage.s_common_options; - let man = help_secs; - - let selectedVersion = { - let doc = "Uninstall the node version specified in $(docv)."; - Arg.( - required - & pos(0, some(string), None) - & info([], ~docv="VERSION", ~doc) - ); - }; - - ( - Term.(const(Commands.uninstall) $ selectedVersion), - Term.info( - "uninstall", - ~envs, - ~version, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let listLocal = { - let doc = "List all the installed versions"; - let sdocs = Manpage.s_common_options; - let man = help_secs; - - ( - Term.(app(const(Commands.listLocal), const())), - Term.info( - "ls", - ~envs, - ~version, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let listRemote = { - let doc = "List all the versions upstream"; - let sdocs = Manpage.s_common_options; - let man = help_secs; - - let selectedVersion = { - let doc = "Filter by specific $(docv)."; - Arg.( - value & pos(0, some(string), None) & info([], ~docv="VERSION", ~doc) - ); - }; - - ( - Term.(const(Commands.listRemote) $ selectedVersion), - Term.info( - "ls-remote", - ~version, - ~envs, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let use = { - let doc = "Switch to another installed node version"; - let man = help_secs; - let sdocs = Manpage.s_common_options; - - let quiet = { - let doc = "Don't print stuff"; - Arg.(value & flag & info(["quiet"], ~doc)); - }; - - let selectedVersion = { - let doc = "Switch to version $(docv).\nLeave empty to look for value from an `.nvmrc` or `.node-version` file"; - Arg.( - value & pos(0, some(string), None) & info([], ~docv="VERSION", ~doc) - ); - }; - - ( - Term.(const(Commands.use) $ selectedVersion $ quiet), - Term.info( - "use", - ~envs, - ~version, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let current = { - let doc = "Display currently activated version"; - let sdocs = Manpage.s_common_options; - let man = help_secs; - - ( - Term.(app(const(Commands.current), const())), - Term.info( - "current", - ~envs, - ~version, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let alias = { - let doc = "Alias a version"; - let sdocs = Manpage.s_common_options; - let man = help_secs; - - let selectedVersion = { - let doc = "The version to be aliased"; - Arg.( - required - & pos(0, some(string), None) - & info([], ~docv="VERSION", ~doc) - ); - }; - - let aliasName = { - let doc = "The alias name"; - Arg.( - required & pos(1, some(string), None) & info([], ~docv="NAME", ~doc) - ); - }; - - ( - Term.(const(Commands.alias) $ selectedVersion $ aliasName), - Term.info( - "alias", - ~envs, - ~version, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let exec = { - let doc = "Execute a binary with the current Node.js in the PATH"; - let man = help_secs; - let sdocs = Manpage.s_common_options; - - let usingVersion = { - let doc = "Use a specific $(docv)"; - Arg.(value & opt(some(string), None) & info(["using"], ~doc)); - }; - - let usingFileVersion = { - let doc = "Use a version from a version file"; - Arg.(value & flag & info(["using-file"], ~doc)); - }; - - let command = { - let doc = "The $(docv) to execute"; - Arg.(non_empty & pos_all(string, []) & info([], ~docv="COMMAND", ~doc)); - }; - - ( - Term.(const(Commands.exec) $ usingVersion $ usingFileVersion $ command), - Term.info( - "exec", - ~envs, - ~version, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let default = { - let doc = "Alias a version as default"; - let man = help_secs; - let sdocs = Manpage.s_common_options; - - let selectedVersion = { - let doc = "The version to be aliased as default"; - Arg.( - required - & pos(0, some(string), None) - & info([], ~docv="VERSION", ~doc) - ); - }; - - ( - Term.(const(Commands.default) $ selectedVersion), - Term.info( - "default", - ~envs, - ~version, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let env = { - let doc = "Show env configurations"; - let sdocs = Manpage.s_common_options; - let man = help_secs; - - let isFishShell = { - let doc = "Output an env configuration for fish shell."; - Arg.(value & flag & info(["fish"], ~doc)); - }; - - let shell = { - open Fnm.System.Shell; - let doc = "Specifies a specific shell type. If omitted, it will be inferred based on the process tree. $(docv)"; - let shellChoices = - Arg.enum([("fish", Fish), ("bash", Bash), ("zsh", Zsh)]); - Arg.(value & opt(some(shellChoices), None) & info(["shell"], ~doc)); - }; - - let nodeDistMirror = { - let doc = "https://nodejs.org/dist mirror"; - Arg.( - value - & opt(string, "https://nodejs.org/dist") - & info(["node-dist-mirror"], ~doc) - ); - }; - - let fnmDir = { - let doc = "The directory to store internal fnm data"; - Arg.( - value - & opt(string, Fnm.Config.FNM_DIR.get()) - & info(["fnm-dir"], ~doc) - ); - }; - - let isMultishell = { - let doc = "Allow different node versions for each shell"; - Arg.(value & flag & info(["multi"], ~doc)); - }; - - let useOnCd = { - let doc = "Hook into the shell `cd` and automatically use the specified version for the project"; - Arg.(value & flag & info(["use-on-cd"], ~doc)); - }; - - let logLevel = { - let doc = "The log level of fnm commands, can be 'quiet', 'error' or 'all'"; - Arg.( - value - & opt( - enum([ - ("quiet", Fnm.LogLevel.Quiet), - ("error", Fnm.LogLevel.Error), - ("info", Fnm.LogLevel.Info), - ("all", Fnm.LogLevel.Debug), - ("debug", Fnm.LogLevel.Debug), - ]), - Fnm.Config.FNM_LOGLEVEL.get(), - ) - & info(["log-level"], ~doc) - ); - }; - - ( - Term.( - const(Commands.env) - $ isFishShell - $ isMultishell - $ nodeDistMirror - $ fnmDir - $ shell - $ useOnCd - $ logLevel - ), - Term.info( - "env", - ~envs, - ~version, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let defaultCmd = { - let doc = "Manage Node.js installations"; - let sdocs = Manpage.s_common_options; - let man = help_secs; - ( - Term.(ret(const(_ => `Help((`Pager, None))) $ const())), - Term.info( - "fnm", - ~envs, - ~version, - ~doc, - ~exits=Term.default_exits, - ~man, - ~sdocs, - ), - ); -}; - -let argv = - Sys.argv - |> Array.map(arg => - switch (arg) { - | "-v" => "--version" - | x => x - } - ); - -let _ = - Term.eval_choice( - defaultCmd, - [ - install, - uninstall, - current, - use, - alias, - default, - listLocal, - listRemote, - env, - exec, - ], - ~argv, - ) - |> Term.exit; diff --git a/executable/Install.re b/executable/Install.re deleted file mode 100644 index 64bc9e6..0000000 --- a/executable/Install.re +++ /dev/null @@ -1,167 +0,0 @@ -open Fnm; - -let mkDownloadsDir = () => { - let exists = Lwt_unix.file_exists(Directories.downloads); - if%lwt (exists |> Lwt.map(x => !x)) { - Logger.debug( - - "Creating " - Directories.downloads - " for the first time" - , - ); - let%lwt _ = System.mkdirp(Directories.downloads); - Lwt.return(); - } else { - Lwt.return(); - }; -}; - -let download = (~version, ~filepath) => { - let tarDestination = - Filename.concat( - Directories.downloads, - version ++ Versions.Remote.downloadFileSuffix, - ); - - Logger.debug( - - "Downloading " - filepath - " to " - tarDestination - , - ); - - let%lwt _ = System.mkdirp(Filename.dirname(tarDestination)); - let%lwt _ = Http.download(filepath, ~into=tarDestination); - let extractionDestination = - Filename.concat(Directories.nodeVersions, version); - - Logger.debug( - - "Extracting " - tarDestination - " to " - extractionDestination - , - ); - - Logger.info( - - "Version " - version - " was successfully downloaded" - , - ); - - let%lwt _ = - Compression.extractFile(tarDestination, ~into=extractionDestination); - Lwt.return_unit; -}; - -let main = (~version as versionName) => { - let%lwt os = System.NodeOS.get() - and arch = System.NodeArch.get() - and versionName = - switch (versionName) { - | Some(versionName) => Lwt.return(versionName) - | None => Dotfiles.getVersion() - }; - - let versionName = Versions.format(versionName); - - let%lwt versionName = - switch (versionName) { - | "latest-*" => - switch%lwt (VersionListingLts.getLatest()) { - | Error(err) => - raise(VersionListingLts.Problem_with_finding_latest_lts(err)) - | Ok({VersionListingLts.lts, _}) => - Printf.sprintf("latest-%s", lts) |> Lwt.return - } - | _ => Lwt.return(versionName) - }; - - Logger.debug( - - "Looking for node " - versionName - " for " - - {System.NodeOS.toString(os)} - " " - {System.NodeArch.toString(arch)} - - , - ); - - let%lwt (fullVersionName, filepath) = - Versions.getFileToDownload(~version=versionName, ~os, ~arch); - - let%lwt isAlreadyInstalled = Versions.isInstalled(fullVersionName); - - let%lwt _ = - if (isAlreadyInstalled) { - Logger.error( - - "Version " - fullVersionName - " is already installed." - , - ); - Lwt.return_unit; - } else { - download(~version=fullVersionName, ~filepath); - }; - - let%lwt _ = - if (Base.String.is_prefix(versionName, ~prefix="latest")) { - let%lwt _ = Alias.run(~name=versionName, ~version=fullVersionName); - Lwt.return_unit; - } else { - Lwt.return_unit; - }; - - Lwt.return_ok(); -}; - -let run = (~version) => - try%lwt(main(~version)) { - | Versions.No_Download_For_System(os, arch) => - Logger.error( - - "Version exists, but can't find a file for your system:\n" - " OS: " - {System.NodeOS.toString(os)} - "\n" - " Architecture: " - {System.NodeArch.toString(arch)} - , - ); - Lwt.return_error(1); - | Versions.Version_not_found(version) => - Logger.error( - - "Version " - version - " not found!" - , - ); - Lwt.return_error(1); - | VersionListingLts.Problem_with_finding_latest_lts( - VersionListingLts.Cant_find_latest_lts, - ) => - Logger.error( "Can't find latest LTS" ); - exit(1); - | VersionListingLts.Problem_with_finding_latest_lts( - VersionListingLts.Cant_parse_remote_version_listing(reason), - ) => - Logger.error( - - "Can't parse json of the response:\n" - reason - , - ); - Lwt.return_error(1); - }; diff --git a/executable/ListLocal.re b/executable/ListLocal.re deleted file mode 100644 index e0b9b30..0000000 --- a/executable/ListLocal.re +++ /dev/null @@ -1,43 +0,0 @@ -open Fnm; - -exception Cant_read_local_versions; - -let main = () => - Versions.Local.( - { - let%lwt versions = - try%lwt(Versions.getInstalledVersions()) { - | _ => Lwt.fail(Cant_read_local_versions) - } - and currentVersion = Versions.getCurrentVersion(); - - Console.log("The following versions are installed:"); - - versions - |> List.iter(version => { - let color = - switch (currentVersion) { - | None => None - | Some(x) when x.name == version.name => Some(Pastel.Cyan) - | Some(_) => None - }; - let aliases = - List.length(version.aliases) === 0 - ? "" - : Printf.sprintf( - " (%s)", - version.aliases |> String.concat(", "), - ); - Console.log( "* " {version.name} aliases ); - }); - - Lwt.return_ok(); - } - ); - -let run = () => - try%lwt(main()) { - | Cant_read_local_versions => - Console.log("No versions installed!"); - Lwt.return_ok(); - }; diff --git a/executable/ListRemote.re b/executable/ListRemote.re deleted file mode 100644 index 4b989ac..0000000 --- a/executable/ListRemote.re +++ /dev/null @@ -1,50 +0,0 @@ -open Fnm; - -let run = (~version as maybeVersionName) => { - Console.log("Looking for some node versions upstream..."); - - let%lwt versions = Versions.getRemoteVersions() - and currentVersion = Versions.getCurrentVersion(); - - let versions = - switch (maybeVersionName) { - | None => versions - | Some(versionName) => - let formattedVersionName = Versions.format(versionName); - versions - |> Versions.( - List.filter(v => - isVersionFitsPrefix(formattedVersionName, Remote.(v.name)) - || v.name == formattedVersionName - ) - ); - }; - - switch (versions) { - | [] => - Console.log( - - "No versions found that match your criteria." - , - ); - Lwt.return_error(1); - - | _ => - versions - |> List.iter(version => { - open Versions.Remote; - let str = "* " ++ version.name; - let color = - switch (currentVersion, version.installed) { - | (Some({name: currentVersionName, _}), _) - when currentVersionName == version.name => - Some(Pastel.Cyan) - | (_, true) => Some(Pastel.Green) - | (_, false) => None - }; - (); - Console.log( str ); - }); - Lwt.return_ok(); - }; -}; diff --git a/executable/Uninstall.re b/executable/Uninstall.re deleted file mode 100644 index 75a8855..0000000 --- a/executable/Uninstall.re +++ /dev/null @@ -1,57 +0,0 @@ -open Fnm; -open Lwt.Infix; - -let run = (~version) => { - let%lwt matchingLocalVersions = - LocalVersionResolver.getMatchingLocalVersions(version); - - switch (matchingLocalVersions) { - | [] => - Logger.error( - - "The version " - version - " is not installed." - , - ); - Lwt.return_error(1); - | [installedVersion] => - Logger.debug( - - "Uninstalling node " - - Versions.Local.(installedVersion.name) - - , - ); - let%lwt _ = Versions.Local.remove(installedVersion); - Logger.info( - - "Node version " - - Versions.Local.(installedVersion.name) - - " has correctly been removed." - , - ); - Lwt.return_ok(); - | _ => - Logger.info( - "There are multiple versions matching your criteria:" , - ); - matchingLocalVersions - |> List.iter(matchingVersion => - Logger.info( - - Versions.Local.(matchingVersion.name) - , - ) - ); - Logger.info( - - "\nPlease run the command again with the correct version." - , - ); - Lwt.return_error(1); - }; -}; diff --git a/executable/Use.re b/executable/Use.re deleted file mode 100644 index a4c58c5..0000000 --- a/executable/Use.re +++ /dev/null @@ -1,142 +0,0 @@ -open Fnm; - -let lwtIgnore = lwt => Lwt.catch(() => lwt, _ => Lwt.return()); - -let info = (~quiet, arg) => - if (!quiet) { - Logger.info(arg); - }; - -let debug = (~quiet, arg) => - if (!quiet) { - Logger.debug(arg); - }; - -let error = (~quiet, arg) => - if (!quiet) { - Logger.error(arg); - }; - -let switchVersion = (~version, ~quiet) => { - let info = info(~quiet); - let debug = debug(~quiet); - let%lwt parsedVersion = LocalVersionResolver.getVersion(version); - - let%lwt versionPath = - switch (parsedVersion) { - | Local(version) => Versions.Local.toDirectory(version) |> Lwt.return - | Alias(alias) => Versions.Aliases.toDirectory(alias) |> Lwt.return - | System => Versions.Local.systemVersion.fullPath |> Lwt.return - }; - - let versionName = - switch (parsedVersion) { - | Local(v) => v - | Alias(v) => v - | System => "system" - }; - - let source = Directories.currentVersion; - - debug( - - "Linking " - source - " to " - versionPath - , - ); - - let%lwt _ = Lwt_unix.unlink(Directories.currentVersion) |> lwtIgnore; - let%lwt _ = Lwt_unix.symlink(versionPath, Directories.currentVersion) - and defaultAliasExists = Lwt_unix.file_exists(Directories.defaultVersion); - - let%lwt _ = - if (!defaultAliasExists) { - Versions.Aliases.set(~alias="default", ~versionPath); - } else { - Lwt.return(); - }; - - info( - - "Using " - versionName - , - ); - - Lwt.return(); -}; - -let main = (~version as providedVersion, ~quiet) => { - let%lwt version = - switch (providedVersion) { - | Some(version) => Lwt.return(version) - | None => Dotfiles.getVersion() - }; - let%lwt () = switchVersion(~version, ~quiet); - Lwt.return_ok(); -}; - -let rec askIfInstall = (~version, ~quiet, retry) => { - let%lwt _ = - Lwt_io.write( - Lwt_io.stderr, - "Do you want to install it? [y/n] " , - ); - switch%lwt (Lwt_io.read_line(Lwt_io.stdin)) { - | "Y" - | "y" => - let%lwt res = Install.run(~version); - switch (res) { - | Error(_) => Lwt.return_error(1) - | Ok(_) => retry(~version, ~quiet) - }; - | "N" - | "n" => - let%lwt () = Lwt_io.write_line(Lwt_io.stderr, "Not installing!"); - Lwt.return_ok(); - | _ => - let%lwt _ = - Lwt_io.write_line(Lwt_io.stderr, "Invalid response. Please try again:"); - askIfInstall(~version, ~quiet, retry); - }; -}; - -let rec run = (~version, ~quiet) => - try%lwt(main(~version, ~quiet)) { - | LocalVersionResolver.Version_Not_Installed(versionString) => - error( - ~quiet, - - "The following version is not installed: " - versionString - , - ); - if (Fnm.Config.FNM_INTERACTIVE_CLI.get()) { - askIfInstall(~version, ~quiet, run); - } else { - Lwt.return_error(1); - }; - | Dotfiles.Conflicting_Dotfiles_Found(v1, v2) => - error( - ~quiet, - - "Can't infer version from dotfiles: .node-version and .nvmrc have differing version strings:\n" - " * " - v1 - "\n" - " * " - v2 - , - ); - Lwt.return_error(1); - | Dotfiles.Version_Not_Provided => - error( - ~quiet, - - "No .nvmrc or .node-version file was found in the current directory. Please provide a version number." - , - ); - Lwt.return_error(1); - }; diff --git a/executable/dune b/executable/dune deleted file mode 100644 index 439a9f4..0000000 --- a/executable/dune +++ /dev/null @@ -1,13 +0,0 @@ - -; !!!! This dune file is generated from the package.json file by pesy. If you modify it by hand -; !!!! your changes will be undone! Instead, edit the package.json and then rerun 'esy pesy' at the project root. -; !!!! If you want to stop using pesy and manage this file by hand, change package.json's 'esy.build' command to: refmterr dune build -p fnm -(executable - ; The entrypoint module - (name FnmApp) ; From package.json main field - ; The name of the executable (runnable via esy x fnm.exe) - (public_name fnm.exe) ; From package.json name field - (libraries base cmdliner lwt lambdasoup console.lib pastel.lib fnm.lib ) ; From package.json require field (array of strings) - (flags ( -ccopt -lgmp )) ; From package.json flags field - (preprocess ( pps lwt_ppx ppx_let )) ; From package.json preprocess field -) \ No newline at end of file diff --git a/feature_tests/aliases/run.sh b/feature_tests/aliases/run.sh deleted file mode 100644 index 09379a2..0000000 --- a/feature_tests/aliases/run.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e - -fnm install 6.11.3 -fnm install 8.11.3 - -fnm alias 8.11.3 oldie -fnm alias 6.11.3 older -fnm default 6.11.3 - -VERSIONS_INSTALLED=$(fnm ls) - -echo "$VERSIONS_INSTALLED" | grep 8.11.3 | grep oldie -echo "$VERSIONS_INSTALLED" | grep 6.11.3 | grep older -echo "$VERSIONS_INSTALLED" | grep 6.11.3 | grep default diff --git a/feature_tests/almost-matching-dotfiles/.node-version b/feature_tests/almost-matching-dotfiles/.node-version deleted file mode 100644 index 933dbb1..0000000 --- a/feature_tests/almost-matching-dotfiles/.node-version +++ /dev/null @@ -1 +0,0 @@ -11.10.0 diff --git a/feature_tests/almost-matching-dotfiles/.nvmrc b/feature_tests/almost-matching-dotfiles/.nvmrc deleted file mode 100644 index 6af635d..0000000 --- a/feature_tests/almost-matching-dotfiles/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v11.10.0 diff --git a/feature_tests/almost-matching-dotfiles/run.sh b/feature_tests/almost-matching-dotfiles/run.sh deleted file mode 100755 index b5850c2..0000000 --- a/feature_tests/almost-matching-dotfiles/run.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -#set -e - -eval $(fnm env) -fnm install -fnm use - -echo node --version -if [ "$(node --version)" != "v11.10.0" ]; then - echo "Expected Node version is not v11.10.0!" - exit 1 -fi diff --git a/feature_tests/basic/run.sh b/feature_tests/basic/run.sh deleted file mode 100644 index 737f669..0000000 --- a/feature_tests/basic/run.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -set -e - -eval $(fnm env) -fnm install v8.11.3 -fnm use v8.11.3 - -if [ "$(node --version)" != "v8.11.3" ]; then - echo "Node version is not v8.11.3!" - exit 1 -fi diff --git a/feature_tests/current/run.sh b/feature_tests/current/run.sh deleted file mode 100755 index d94722c..0000000 --- a/feature_tests/current/run.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -set -e - -PATH="$(pwd)":$PATH # simulating a custom `node` - -eval "$(fnm env)" - -if [ "$(fnm current)" != "none" ]; then - echo "Expected currently activated version is not none!" - exit 1 -fi - -fnm install v8.11.3 -fnm install v10.10.0 -fnm use v8.11.3 - -if [ "$(fnm current)" != "v8.11.3" ]; then - echo "Expected currently activated version is not v8.11.3!" - exit 1 -fi - -fnm use v10.10.0 - -if [ "$(fnm current)" != "v10.10.0" ]; then - echo "Expected currently activated version is not v10.10.0!" - exit 1 -fi - -fnm use system - -if [ "$(fnm current)" != "system" ]; then - echo "Expected currently activated version is not system!" - exit 1 -fi diff --git a/feature_tests/exec/run.sh b/feature_tests/exec/run.sh deleted file mode 100755 index f5a3888..0000000 --- a/feature_tests/exec/run.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -set -e - -fnm install v6.10.0 -fnm install v8.10.0 -fnm install v10.10.0 -fnm use v8.10.0 - -fnm exec -- node -v | grep "v8.10.0" -fnm exec --using 6 -- node -v | grep "v6.10.0" -fnm exec --using 10 -- node -v | grep "v10.10.0" diff --git a/feature_tests/existing_installation/run.sh b/feature_tests/existing_installation/run.sh deleted file mode 100644 index 9789ee5..0000000 --- a/feature_tests/existing_installation/run.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -set -e - -eval `fnm env` - -echo "> Installing for the first time..." -fnm install v8.11.3 -echo "> Installing the second time..." -fnm install v8.11.3 2>&1 >/dev/null | grep "already installed" - -if [ "$?" != "0" ]; then - echo "The second installation should say it is already installed" - exit 1 -fi diff --git a/feature_tests/fish/run.fish b/feature_tests/fish/run.fish deleted file mode 100644 index 8234133..0000000 --- a/feature_tests/fish/run.fish +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env fish - -fnm env --fish | source - -fnm install v8.11.3 -fnm use v8.11.3 - -if test (node --version) != "v8.11.3" - echo "Node version is not v8.11.3!" - exit 1 -end diff --git a/feature_tests/fish/run.sh b/feature_tests/fish/run.sh deleted file mode 100755 index df4a3ec..0000000 --- a/feature_tests/fish/run.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -e - -DIRECTORY=`dirname $0` - -if hash fish 2>/dev/null; then - fish $DIRECTORY/run.fish -else - echo "Skipping: \`fish\` is not installed" -fi diff --git a/feature_tests/latest-lts/.nvmrc b/feature_tests/latest-lts/.nvmrc deleted file mode 100644 index b009dfb..0000000 --- a/feature_tests/latest-lts/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -lts/* diff --git a/feature_tests/latest-lts/run.sh b/feature_tests/latest-lts/run.sh deleted file mode 100755 index f47e0f7..0000000 --- a/feature_tests/latest-lts/run.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -set -e - -eval "$(fnm env --multi)" - -fnm install -fnm use - -fnm ls | grep latest- diff --git a/feature_tests/list_local_with_nothing_installed/run.sh b/feature_tests/list_local_with_nothing_installed/run.sh deleted file mode 100644 index dcd9deb..0000000 --- a/feature_tests/list_local_with_nothing_installed/run.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -e - -eval $(fnm env) -fnm ls diff --git a/feature_tests/log-level-error/run.sh b/feature_tests/log-level-error/run.sh deleted file mode 100644 index cdcd053..0000000 --- a/feature_tests/log-level-error/run.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -e - -eval $(fnm env --log-level=error) -ALIAS="$(fnm install 8.11.3 && (fnm alias 123 abc 2>&1 || true))" - -if [ "$ALIAS" == "" ]; then - echo "Expected the output to contain errors" - exit 1 -fi diff --git a/feature_tests/log-level-quiet/run.sh b/feature_tests/log-level-quiet/run.sh deleted file mode 100644 index 4a541b2..0000000 --- a/feature_tests/log-level-quiet/run.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -set -e - -eval $(fnm env --log-level=quiet) -INSTALL="$(fnm install v8.11.3 && fnm use v8.11.3 && fnm alias v8.11.3 something)" - -OUTPUT="$INSTALL" -if [ "$OUTPUT" != "" ]; then - echo "Expected the output to be empty, instead got:" - echo $OUTPUT - exit 1 -fi diff --git a/feature_tests/matching-dotfiles/.node-version b/feature_tests/matching-dotfiles/.node-version deleted file mode 100644 index 933dbb1..0000000 --- a/feature_tests/matching-dotfiles/.node-version +++ /dev/null @@ -1 +0,0 @@ -11.10.0 diff --git a/feature_tests/matching-dotfiles/.nvmrc b/feature_tests/matching-dotfiles/.nvmrc deleted file mode 100644 index 933dbb1..0000000 --- a/feature_tests/matching-dotfiles/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -11.10.0 diff --git a/feature_tests/matching-dotfiles/run.sh b/feature_tests/matching-dotfiles/run.sh deleted file mode 100755 index fa58c8a..0000000 --- a/feature_tests/matching-dotfiles/run.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -set -e - -eval $(fnm env) -fnm install -fnm use - -echo node --version -if [ "$(node --version)" != "v11.10.0" ]; then - echo "Expected Node version is not v11.10.0!" - exit 1 -fi diff --git a/feature_tests/multishell/run.sh b/feature_tests/multishell/run.sh deleted file mode 100644 index b7efcf6..0000000 --- a/feature_tests/multishell/run.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -set -e - -eval $(fnm env) - -fnm install v8.11.3 -fnm install v11.9.0 - -fnm use v8.11.3 - -bash -c ' - set -e - eval $(fnm env --multi) - fnm use v11.9.0 - echo "> verifying version v11.9.0 for child bash" - if [ "$(node -v)" == "v11.9.0" ]; then - echo "Okay!" - else - echo "Node version should be v11.9.0 in the bash fork" - exit 1 - fi -' - -echo "> verifying version v8.11.3 for parent bash" -if [ "$(node -v)" == "v8.11.3" ]; then - echo "Okay!" -else - echo "Node version should be v8.11.3 in the base bash" - exit 1 -fi diff --git a/feature_tests/node-version/.node-version b/feature_tests/node-version/.node-version deleted file mode 100644 index 933dbb1..0000000 --- a/feature_tests/node-version/.node-version +++ /dev/null @@ -1 +0,0 @@ -11.10.0 diff --git a/feature_tests/node-version/run.sh b/feature_tests/node-version/run.sh deleted file mode 100644 index 6c017ea..0000000 --- a/feature_tests/node-version/run.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -set -e - -eval $(fnm env) -fnm install -fnm use - -if [ "$(node --version)" != "v11.10.0" ]; then - echo "Node version is not v11.10.0!" - exit 1 -fi diff --git a/feature_tests/node_mirror_installation/run.sh b/feature_tests/node_mirror_installation/run.sh deleted file mode 100644 index b2afdf9..0000000 --- a/feature_tests/node_mirror_installation/run.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -set -e - -eval `fnm env --node-dist-mirror="https://cnpmjs.org/dist"` - -fnm install v8.11.3 -fnm use v8.11.3 - -if [ "$(node -v)" != "v8.11.3" ]; then - echo "Node version is not v8.11.3!" - exit 1 -fi diff --git a/feature_tests/nvmrc/.nvmrc b/feature_tests/nvmrc/.nvmrc deleted file mode 100644 index fe6d2ac..0000000 --- a/feature_tests/nvmrc/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -10.9.0 diff --git a/feature_tests/nvmrc/run.sh b/feature_tests/nvmrc/run.sh deleted file mode 100644 index a4941a9..0000000 --- a/feature_tests/nvmrc/run.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -set -e - -eval $(fnm env) -fnm install -fnm use - -if [ "$(node --version)" != "v10.9.0" ]; then - echo "Node version is not v10.9.0!" - exit 1 -fi diff --git a/feature_tests/partial_semver/run.sh b/feature_tests/partial_semver/run.sh deleted file mode 100644 index 9be109a..0000000 --- a/feature_tests/partial_semver/run.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -set -e - -eval `fnm env --multi` - -fnm install 6 # no new versions would be issued for this unsupported version -fnm install 8.11.3 - -fnm use 6 -if [ "$(node -v)" != "v6.17.1" ]; then - echo "Node version mismatch: $(node -v). Expected: v6.17.1" - exit 1 -fi - -fnm use 8 -if [ "$(node -v)" != "v8.11.3" ]; then - echo "Node version mismatch: $(node -v). Expected: v8.11.3" - exit 1 -fi diff --git a/feature_tests/run.sh b/feature_tests/run.sh deleted file mode 100755 index 2aef50a..0000000 --- a/feature_tests/run.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -set -e - -DIRECTORY="$(dirname "$0")" -BINARY="$1" -SPECIFIC_TEST="$2" -TEMP_DIR_BASE=$(pwd)/$DIRECTORY/.tmp -TEMP_BINARY_PATH=$TEMP_DIR_BASE/bin -TEMP_FNM_DIR=$TEMP_DIR_BASE/.fnm - -if [ "$BINARY" == "" ]; then - echo "No binary supplied!" - exit 1 -fi - -echo "using fnm=$BINARY" - -rm -rf "$TEMP_DIR_BASE" -mkdir "$TEMP_DIR_BASE" "$TEMP_BINARY_PATH" -cp "$BINARY" "$TEMP_BINARY_PATH/fnm" - -run_test() { - test_file="$1" - rm -rf "$TEMP_FNM_DIR" - - TEST_BASENAME="$(basename "$test_file")" - TEST_DIRNAME="$(dirname "$test_file")" - - echo "Running test in $test_file" - echo "Running test in $test_file" | sed "s/./-/g" - (cd "$TEST_DIRNAME" && FNM_DIR="$TEMP_FNM_DIR" PATH="$TEMP_BINARY_PATH:$PATH" bash "$TEST_BASENAME") - echo "" - echo " -> Finished!" - - rm -rf "$TEMP_FNM_DIR" -} - -if [ "$SPECIFIC_TEST" == "" ]; then - for test_file in "$DIRECTORY"/*/run.sh; do - run_test "$test_file" - done -else - run_test "$SPECIFIC_TEST" -fi diff --git a/feature_tests/system_node/node b/feature_tests/system_node/node deleted file mode 100755 index 08ad704..0000000 --- a/feature_tests/system_node/node +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -echo "custom build" diff --git a/feature_tests/system_node/run.sh b/feature_tests/system_node/run.sh deleted file mode 100755 index 32d3140..0000000 --- a/feature_tests/system_node/run.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -set -e - -PATH="$(pwd)":$PATH # simulating a custom `node` - -eval "$(fnm env --multi)" -fnm install 10 -fnm use 10 -fnm use system - -NVER="$(node -v)" -if [ "$NVER" != "custom build" ]; then - echo "Expected \`node -v\` to be resolved to the system Node.js, but got $NVER" - exit 1 -fi diff --git a/feature_tests/use_nvmrc_lts/.nvmrc b/feature_tests/use_nvmrc_lts/.nvmrc deleted file mode 100644 index 0312896..0000000 --- a/feature_tests/use_nvmrc_lts/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -lts/dubnium diff --git a/feature_tests/use_nvmrc_lts/run.sh b/feature_tests/use_nvmrc_lts/run.sh deleted file mode 100644 index bace121..0000000 --- a/feature_tests/use_nvmrc_lts/run.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -e - -eval "$(fnm env)" -fnm install -fnm use - -fnm ls | grep latest-dubnium diff --git a/feature_tests/use_on_cd/dot node version/.node-version b/feature_tests/use_on_cd/dot node version/.node-version deleted file mode 100644 index dba04c1..0000000 --- a/feature_tests/use_on_cd/dot node version/.node-version +++ /dev/null @@ -1 +0,0 @@ -8.11.3 diff --git a/feature_tests/use_on_cd/nvmrc/.nvmrc b/feature_tests/use_on_cd/nvmrc/.nvmrc deleted file mode 100644 index dba04c1..0000000 --- a/feature_tests/use_on_cd/nvmrc/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -8.11.3 diff --git a/feature_tests/use_on_cd/run.sh b/feature_tests/use_on_cd/run.sh deleted file mode 100644 index d89db2d..0000000 --- a/feature_tests/use_on_cd/run.sh +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/bash - -set -e - -eval "$(fnm env --multi)" -fnm install 6.11.3 -fnm install 8.11.3 -fnm use 6.11.3 - -if hash zsh 2>/dev/null; then - echo ' > Running test on Zsh' - - zsh -c ' - set -e - - eval "`fnm env --multi --use-on-cd`" - - fnm use 6.11.3 - - NODE_VERSION=$(node -v) - if [ "$NODE_VERSION" != "v6.11.3" ]; then - echo "Failed: Node version ($NODE_VERSION) is not v6.11.3" - exit 1 - fi - - cd nvmrc - - NODE_VERSION=$(node -v) - if [ "$NODE_VERSION" != "v8.11.3" ]; then - echo "Failed: Node version ($NODE_VERSION) is not v8.11.3" - exit 1 - fi - - fnm use 6.11.3 - cd ../dot\ node\ version - - NODE_VERSION=$(node -v) - if [ "$NODE_VERSION" != "v8.11.3" ]; then - echo "Failed: Node version ($NODE_VERSION) is not v8.11.3" - exit 1 - fi - ' -else - echo "Skipping zsh test: \`zsh\` is not installed" -fi - -if hash fish 2>/dev/null; then - echo ' > Running test on Fish' - - fish -c ' - fnm env --multi --use-on-cd | source - - fnm use 6.11.3 - - set NODE_VERSION (node -v) - if test "$NODE_VERSION" != "v6.11.3" - echo "Failed: Node version ($NODE_VERSION) is not v6.11.3" - exit 1 - end - - cd nvmrc - - set NODE_VERSION (node -v) - if test "$NODE_VERSION" != "v8.11.3" - echo "Failed: Node version ($NODE_VERSION) is not v8.11.3" - exit 1 - end - - fnm use 6.11.3 - cd ../dot\ node\ version - - set NODE_VERSION (node -v) - if test "$NODE_VERSION" != "v8.11.3" - echo "Failed: Node version ($NODE_VERSION) is not v8.11.3" - exit 1 - end - ' -else - echo "Skipping fish test: \`zsh\` is not installed" -fi - -echo " > Running test on Bash..." -bash -c ' - set -e - shopt -s expand_aliases - eval "`fnm env --multi --use-on-cd`" - fnm use 6.11.3 - NODE_VERSION=$(node -v) - if [ "$NODE_VERSION" != "v6.11.3" ]; then - echo "Failed: Node version ($NODE_VERSION) is not v6.11.3" - exit 1 - fi - cd nvmrc - NODE_VERSION=$(node -v) - if [ "$NODE_VERSION" != "v8.11.3" ]; then - echo "Failed: Node version ($NODE_VERSION) is not v8.11.3" - exit 1 - fi - fnm use 6.11.3 - cd ../dot\ node\ version - NODE_VERSION=$(node -v) - if [ "$NODE_VERSION" != "v8.11.3" ]; then - echo "Failed: Node version ($NODE_VERSION) is not v8.11.3" - exit 1 - fi -' diff --git a/fmt.esy.lock/.gitattributes b/fmt.esy.lock/.gitattributes deleted file mode 100644 index 25366ae..0000000 --- a/fmt.esy.lock/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ - -# Set eol to LF so files aren't converted to CRLF-eol on Windows. -* text eol=lf diff --git a/fmt.esy.lock/.gitignore b/fmt.esy.lock/.gitignore deleted file mode 100644 index a221be2..0000000 --- a/fmt.esy.lock/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ - -# Reset any possible .gitignore, we want all esy.lock to be un-ignored. -!* diff --git a/fmt.esy.lock/index.json b/fmt.esy.lock/index.json deleted file mode 100644 index 012ddea..0000000 --- a/fmt.esy.lock/index.json +++ /dev/null @@ -1,359 +0,0 @@ -{ - "checksum": "86b3a839605635d3ce86e1467d798857", - "root": "fmt@link-dev:./fmt.json", - "node": { - "ocaml@4.6.1000@d41d8cd9": { - "id": "ocaml@4.6.1000@d41d8cd9", - "name": "ocaml", - "version": "4.6.1000", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/ocaml/-/ocaml-4.6.1000.tgz#sha1:99525ef559353481396454f9a072dedc96b52f44" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "fmt@link-dev:./fmt.json": { - "id": "fmt@link-dev:./fmt.json", - "name": "fmt", - "version": "link-dev:./fmt.json", - "source": { "type": "link-dev", "path": ".", "manifest": "fmt.json" }, - "overrides": [], - "dependencies": [], - "devDependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@esy-ocaml/reason@3.5.2@d41d8cd9" - ] - }, - "@opam/result@opam:1.4@dc720aef": { - "id": "@opam/result@opam:1.4@dc720aef", - "name": "@opam/result", - "version": "opam:1.4", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/d3/d3162dbc501a2af65c8c71e0866541da#md5:d3162dbc501a2af65c8c71e0866541da", - "archive:https://github.com/janestreet/result/archive/1.4.tar.gz#md5:d3162dbc501a2af65c8c71e0866541da" - ], - "opam": { - "name": "result", - "version": "1.4", - "path": "fmt.esy.lock/opam/result.1.4" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.3@9894df55", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.3@9894df55" - ] - }, - "@opam/ppx_derivers@opam:1.2.1@ecf0aa45": { - "id": "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", - "name": "@opam/ppx_derivers", - "version": "opam:1.2.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/5d/5dc2bf130c1db3c731fe0fffc5648b41#md5:5dc2bf130c1db3c731fe0fffc5648b41", - "archive:https://github.com/ocaml-ppx/ppx_derivers/archive/1.2.1.tar.gz#md5:5dc2bf130c1db3c731fe0fffc5648b41" - ], - "opam": { - "name": "ppx_derivers", - "version": "1.2.1", - "path": "fmt.esy.lock/opam/ppx_derivers.1.2.1" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.3@9894df55", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.3@9894df55" - ] - }, - "@opam/ocamlfind@opam:1.8.1@ff07b0f9": { - "id": "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "name": "@opam/ocamlfind", - "version": "opam:1.8.1", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/18/18ca650982c15536616dea0e422cbd8c#md5:18ca650982c15536616dea0e422cbd8c", - "archive:http://download2.camlcity.org/download/findlib-1.8.1.tar.gz#md5:18ca650982c15536616dea0e422cbd8c", - "archive:http://download.camlcity.org/download/findlib-1.8.1.tar.gz#md5:18ca650982c15536616dea0e422cbd8c" - ], - "opam": { - "name": "ocamlfind", - "version": "1.8.1", - "path": "fmt.esy.lock/opam/ocamlfind.1.8.1" - } - }, - "overrides": [ - { - "opamoverride": - "fmt.esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override" - } - ], - "dependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/conf-m4@opam:1@3b2b148a", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ "ocaml@4.6.1000@d41d8cd9" ] - }, - "@opam/ocamlbuild@opam:0.14.0@6ac75d03": { - "id": "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "name": "@opam/ocamlbuild", - "version": "opam:0.14.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/87/87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78#sha256:87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78", - "archive:https://github.com/ocaml/ocamlbuild/archive/0.14.0.tar.gz#sha256:87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78" - ], - "opam": { - "name": "ocamlbuild", - "version": "0.14.0", - "path": "fmt.esy.lock/opam/ocamlbuild.0.14.0" - } - }, - "overrides": [ - { - "opamoverride": - "fmt.esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override" - } - ], - "dependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ "ocaml@4.6.1000@d41d8cd9" ] - }, - "@opam/ocaml-migrate-parsetree@opam:1.4.0@0c4ec62d": { - "id": "@opam/ocaml-migrate-parsetree@opam:1.4.0@0c4ec62d", - "name": "@opam/ocaml-migrate-parsetree", - "version": "opam:1.4.0", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/23/231fbdc205187b3ee266b535d9cfe44b599067b2f6e97883c782ea7bb577d3b8#sha256:231fbdc205187b3ee266b535d9cfe44b599067b2f6e97883c782ea7bb577d3b8", - "archive:https://github.com/ocaml-ppx/ocaml-migrate-parsetree/releases/download/v1.4.0/ocaml-migrate-parsetree-v1.4.0.tbz#sha256:231fbdc205187b3ee266b535d9cfe44b599067b2f6e97883c782ea7bb577d3b8" - ], - "opam": { - "name": "ocaml-migrate-parsetree", - "version": "1.4.0", - "path": "fmt.esy.lock/opam/ocaml-migrate-parsetree.1.4.0" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/result@opam:1.4@dc720aef", - "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", - "@opam/dune@opam:1.11.3@9894df55", "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/result@opam:1.4@dc720aef", - "@opam/ppx_derivers@opam:1.2.1@ecf0aa45", - "@opam/dune@opam:1.11.3@9894df55" - ] - }, - "@opam/merlin-extend@opam:0.5@a5dd7d4b": { - "id": "@opam/merlin-extend@opam:0.5@a5dd7d4b", - "name": "@opam/merlin-extend", - "version": "opam:0.5", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/ca/ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227#sha256:ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227", - "archive:https://github.com/let-def/merlin-extend/releases/download/v0.5/merlin-extend-v0.5.tbz#sha256:ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227" - ], - "opam": { - "name": "merlin-extend", - "version": "0.5", - "path": "fmt.esy.lock/opam/merlin-extend.0.5" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.3@9894df55", - "@opam/cppo@opam:1.6.6@f4f83858", "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.3@9894df55" - ] - }, - "@opam/menhir@opam:20190924@004407ff": { - "id": "@opam/menhir@opam:20190924@004407ff", - "name": "@opam/menhir", - "version": "opam:20190924", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/md5/67/677f1997fb73177d5a00fa1b8d61c3ef#md5:677f1997fb73177d5a00fa1b8d61c3ef", - "archive:https://gitlab.inria.fr/fpottier/menhir/repository/20190924/archive.tar.gz#md5:677f1997fb73177d5a00fa1b8d61c3ef" - ], - "opam": { - "name": "menhir", - "version": "20190924", - "path": "fmt.esy.lock/opam/menhir.20190924" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocamlbuild@opam:0.14.0@6ac75d03", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ "ocaml@4.6.1000@d41d8cd9" ] - }, - "@opam/dune@opam:1.11.3@9894df55": { - "id": "@opam/dune@opam:1.11.3@9894df55", - "name": "@opam/dune", - "version": "opam:1.11.3", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/c8/c83a63e7e8245611b0e11d6adea07c6484dc1b4efffacb176315cd6674d4bbd2#sha256:c83a63e7e8245611b0e11d6adea07c6484dc1b4efffacb176315cd6674d4bbd2", - "archive:https://github.com/ocaml/dune/releases/download/1.11.3/dune-build-info-1.11.3.tbz#sha256:c83a63e7e8245611b0e11d6adea07c6484dc1b4efffacb176315cd6674d4bbd2" - ], - "opam": { - "name": "dune", - "version": "1.11.3", - "path": "fmt.esy.lock/opam/dune.1.11.3" - } - }, - "overrides": [ - { - "opamoverride": - "fmt.esy.lock/overrides/opam__s__dune_opam__c__1.11.3_opam_override" - } - ], - "dependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/base-unix@opam:base@87d0b2eb", - "@opam/base-threads@opam:base@36803084", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/base-unix@opam:base@87d0b2eb", - "@opam/base-threads@opam:base@36803084" - ] - }, - "@opam/cppo@opam:1.6.6@f4f83858": { - "id": "@opam/cppo@opam:1.6.6@f4f83858", - "name": "@opam/cppo", - "version": "opam:1.6.6", - "source": { - "type": "install", - "source": [ - "archive:https://opam.ocaml.org/cache/sha256/e7/e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0#sha256:e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0", - "archive:https://github.com/ocaml-community/cppo/releases/download/v1.6.6/cppo-v1.6.6.tbz#sha256:e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0" - ], - "opam": { - "name": "cppo", - "version": "1.6.6", - "path": "fmt.esy.lock/opam/cppo.1.6.6" - } - }, - "overrides": [], - "dependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.3@9894df55", - "@opam/base-unix@opam:base@87d0b2eb", - "@esy-ocaml/substs@0.0.1@d41d8cd9" - ], - "devDependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/dune@opam:1.11.3@9894df55", - "@opam/base-unix@opam:base@87d0b2eb" - ] - }, - "@opam/conf-m4@opam:1@3b2b148a": { - "id": "@opam/conf-m4@opam:1@3b2b148a", - "name": "@opam/conf-m4", - "version": "opam:1", - "source": { - "type": "install", - "source": [ "no-source:" ], - "opam": { - "name": "conf-m4", - "version": "1", - "path": "fmt.esy.lock/opam/conf-m4.1" - } - }, - "overrides": [], - "dependencies": [ "@esy-ocaml/substs@0.0.1@d41d8cd9" ], - "devDependencies": [] - }, - "@opam/base-unix@opam:base@87d0b2eb": { - "id": "@opam/base-unix@opam:base@87d0b2eb", - "name": "@opam/base-unix", - "version": "opam:base", - "source": { - "type": "install", - "source": [ "no-source:" ], - "opam": { - "name": "base-unix", - "version": "base", - "path": "fmt.esy.lock/opam/base-unix.base" - } - }, - "overrides": [], - "dependencies": [ "@esy-ocaml/substs@0.0.1@d41d8cd9" ], - "devDependencies": [] - }, - "@opam/base-threads@opam:base@36803084": { - "id": "@opam/base-threads@opam:base@36803084", - "name": "@opam/base-threads", - "version": "opam:base", - "source": { - "type": "install", - "source": [ "no-source:" ], - "opam": { - "name": "base-threads", - "version": "base", - "path": "fmt.esy.lock/opam/base-threads.base" - } - }, - "overrides": [], - "dependencies": [ "@esy-ocaml/substs@0.0.1@d41d8cd9" ], - "devDependencies": [] - }, - "@esy-ocaml/substs@0.0.1@d41d8cd9": { - "id": "@esy-ocaml/substs@0.0.1@d41d8cd9", - "name": "@esy-ocaml/substs", - "version": "0.0.1", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@esy-ocaml/substs/-/substs-0.0.1.tgz#sha1:59ebdbbaedcda123fc7ed8fb2b302b7d819e9a46" - ] - }, - "overrides": [], - "dependencies": [], - "devDependencies": [] - }, - "@esy-ocaml/reason@3.5.2@d41d8cd9": { - "id": "@esy-ocaml/reason@3.5.2@d41d8cd9", - "name": "@esy-ocaml/reason", - "version": "3.5.2", - "source": { - "type": "install", - "source": [ - "archive:https://registry.npmjs.org/@esy-ocaml/reason/-/reason-3.5.2.tgz#sha1:ac48b63fd66fbbc1d77ab6a2b7e3a1ba21a8f40b" - ] - }, - "overrides": [], - "dependencies": [ - "ocaml@4.6.1000@d41d8cd9", "@opam/result@opam:1.4@dc720aef", - "@opam/ocamlfind@opam:1.8.1@ff07b0f9", - "@opam/ocaml-migrate-parsetree@opam:1.4.0@0c4ec62d", - "@opam/merlin-extend@opam:0.5@a5dd7d4b", - "@opam/menhir@opam:20190924@004407ff", - "@opam/dune@opam:1.11.3@9894df55" - ], - "devDependencies": [] - } - } -} \ No newline at end of file diff --git a/fmt.esy.lock/opam/base-threads.base/opam b/fmt.esy.lock/opam/base-threads.base/opam deleted file mode 100644 index 914ff50..0000000 --- a/fmt.esy.lock/opam/base-threads.base/opam +++ /dev/null @@ -1,6 +0,0 @@ -opam-version: "2.0" -maintainer: "https://github.com/ocaml/opam-repository/issues" -description: """ -Threads library distributed with the OCaml compiler -""" - diff --git a/fmt.esy.lock/opam/base-unix.base/opam b/fmt.esy.lock/opam/base-unix.base/opam deleted file mode 100644 index b973540..0000000 --- a/fmt.esy.lock/opam/base-unix.base/opam +++ /dev/null @@ -1,6 +0,0 @@ -opam-version: "2.0" -maintainer: "https://github.com/ocaml/opam-repository/issues" -description: """ -Unix library distributed with the OCaml compiler -""" - diff --git a/fmt.esy.lock/opam/conf-m4.1/opam b/fmt.esy.lock/opam/conf-m4.1/opam deleted file mode 100644 index c6feb2a..0000000 --- a/fmt.esy.lock/opam/conf-m4.1/opam +++ /dev/null @@ -1,22 +0,0 @@ -opam-version: "2.0" -maintainer: "tim@gfxmonk.net" -homepage: "http://www.gnu.org/software/m4/m4.html" -bug-reports: "https://github.com/ocaml/opam-repository/issues" -authors: "GNU Project" -license: "GPL-3.0-only" -build: [["sh" "-exc" "echo | m4"]] -depexts: [ - ["m4"] {os-family = "debian"} - ["m4"] {os-distribution = "fedora"} - ["m4"] {os-distribution = "rhel"} - ["m4"] {os-distribution = "centos"} - ["m4"] {os-distribution = "alpine"} - ["m4"] {os-distribution = "nixos"} - ["m4"] {os-family = "suse"} - ["m4"] {os-distribution = "ol"} - ["m4"] {os-distribution = "arch"} -] -synopsis: "Virtual package relying on m4" -description: - "This package can only install if the m4 binary is installed on the system." -flags: conf diff --git a/fmt.esy.lock/opam/cppo.1.6.6/opam b/fmt.esy.lock/opam/cppo.1.6.6/opam deleted file mode 100644 index f683f8b..0000000 --- a/fmt.esy.lock/opam/cppo.1.6.6/opam +++ /dev/null @@ -1,37 +0,0 @@ -opam-version: "2.0" -maintainer: "martin@mjambon.com" -authors: "Martin Jambon" -license: "BSD-3-Clause" -homepage: "http://mjambon.com/cppo.html" -doc: "https://ocaml-community.github.io/cppo/" -bug-reports: "https://github.com/ocaml-community/cppo/issues" -depends: [ - "ocaml" {>= "4.03"} - "dune" {>= "1.0"} - "base-unix" -] -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] - ["dune" "runtest" "-p" name "-j" jobs] {with-test} -] -dev-repo: "git+https://github.com/ocaml-community/cppo.git" -synopsis: "Code preprocessor like cpp for OCaml" -description: """ -Cppo is an equivalent of the C preprocessor for OCaml programs. -It allows the definition of simple macros and file inclusion. - -Cppo is: - -* more OCaml-friendly than cpp -* easy to learn without consulting a manual -* reasonably fast -* simple to install and to maintain -""" -url { - src: "https://github.com/ocaml-community/cppo/releases/download/v1.6.6/cppo-v1.6.6.tbz" - checksum: [ - "sha256=e7272996a7789175b87bb998efd079794a8db6625aae990d73f7b4484a07b8a0" - "sha512=44ecf9d225d9e45490a2feac0bde04865ca398dba6c3579e3370fcd1ea255707b8883590852af8b2df87123801062b9f3acce2455c092deabf431f9c4fb8d8eb" - ] -} diff --git a/fmt.esy.lock/opam/dune.1.11.3/opam b/fmt.esy.lock/opam/dune.1.11.3/opam deleted file mode 100644 index af3286b..0000000 --- a/fmt.esy.lock/opam/dune.1.11.3/opam +++ /dev/null @@ -1,53 +0,0 @@ -opam-version: "2.0" -synopsis: "Fast, portable and opinionated build system" -description: """ - -dune is a build system that was designed to simplify the release of -Jane Street packages. It reads metadata from "dune" files following a -very simple s-expression syntax. - -dune is fast, it has very low-overhead and support parallel builds on -all platforms. It has no system dependencies, all you need to build -dune and packages using dune is OCaml. You don't need or make or bash -as long as the packages themselves don't use bash explicitly. - -dune supports multi-package development by simply dropping multiple -repositories into the same directory. - -It also supports multi-context builds, such as building against -several opam roots/switches simultaneously. This helps maintaining -packages across several versions of OCaml and gives cross-compilation -for free. -""" -maintainer: ["Jane Street Group, LLC "] -authors: ["Jane Street Group, LLC "] -license: "MIT" -homepage: "https://github.com/ocaml/dune" -doc: "https://dune.readthedocs.io/" -bug-reports: "https://github.com/ocaml/dune/issues" -depends: [ - "ocaml" {>= "4.02"} - "base-unix" - "base-threads" -] -conflicts: [ - "jbuilder" {!= "transition"} - "odoc" {< "1.3.0"} - "dune-release" {< "1.3.0"} -] -dev-repo: "git+https://github.com/ocaml/dune.git" -build: [ - # opam 2 sets OPAM_SWITCH_PREFIX, so we don't need a hardcoded path - ["ocaml" "configure.ml" "--libdir" lib] {opam-version < "2"} - ["ocaml" "bootstrap.ml"] - ["./boot.exe" "--release" "--subst"] {pinned} - ["./boot.exe" "--release" "-j" jobs] -] -url { - src: - "https://github.com/ocaml/dune/releases/download/1.11.3/dune-build-info-1.11.3.tbz" - checksum: [ - "sha256=c83a63e7e8245611b0e11d6adea07c6484dc1b4efffacb176315cd6674d4bbd2" - "sha512=2c1532b91d223e6ea0628c5f5174792c1bb4113a464f6d8b878b3c58be1136beb84ba2d9883a330fa20e550367588aa923ba06ffb9b615a098a21374a9377e81" - ] -} diff --git a/fmt.esy.lock/opam/menhir.20190924/opam b/fmt.esy.lock/opam/menhir.20190924/opam deleted file mode 100644 index 348967a..0000000 --- a/fmt.esy.lock/opam/menhir.20190924/opam +++ /dev/null @@ -1,29 +0,0 @@ -opam-version: "2.0" -maintainer: "francois.pottier@inria.fr" -authors: [ - "François Pottier " - "Yann Régis-Gianas " -] -homepage: "http://gitlab.inria.fr/fpottier/menhir" -dev-repo: "git+https://gitlab.inria.fr/fpottier/menhir.git" -bug-reports: "menhir@inria.fr" -build: [ - [make "-f" "Makefile" "PREFIX=%{prefix}%" "USE_OCAMLFIND=true" "docdir=%{doc}%/menhir" "libdir=%{lib}%/menhir" "mandir=%{man}%/man1"] -] -install: [ - [make "-f" "Makefile" "install" "PREFIX=%{prefix}%" "docdir=%{doc}%/menhir" "libdir=%{lib}%/menhir" "mandir=%{man}%/man1"] -] -depends: [ - "ocaml" {>= "4.02"} - "ocamlfind" {build} - "ocamlbuild" {build} -] -synopsis: "An LR(1) parser generator" -url { - src: - "https://gitlab.inria.fr/fpottier/menhir/repository/20190924/archive.tar.gz" - checksum: [ - "md5=677f1997fb73177d5a00fa1b8d61c3ef" - "sha512=ea8a9a6d773529cf6ac05e4c6c4532770fbb8e574c9b646efcefe90d9f24544741e3e8cfd94c8afea0447e34059a8c79c2829b46764ce3a3d6dcb3e7f75980fc" - ] -} diff --git a/fmt.esy.lock/opam/merlin-extend.0.5/opam b/fmt.esy.lock/opam/merlin-extend.0.5/opam deleted file mode 100644 index a3ae0d3..0000000 --- a/fmt.esy.lock/opam/merlin-extend.0.5/opam +++ /dev/null @@ -1,29 +0,0 @@ -opam-version: "2.0" -maintainer: "Frederic Bour " -authors: "Frederic Bour " -homepage: "https://github.com/let-def/merlin-extend" -bug-reports: "https://github.com/let-def/merlin-extend" -license: "MIT" -dev-repo: "git+https://github.com/let-def/merlin-extend.git" -build: [ - ["dune" "subst"] {pinned} - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "dune" {>= "1.0"} - "cppo" {build} - "ocaml" {>= "4.02.3"} -] -synopsis: "A protocol to provide custom frontend to Merlin" -description: """ -This protocol allows to replace the OCaml frontend of Merlin. -It extends what used to be done with the `-pp' flag to handle a few more cases.""" -doc: "https://let-def.github.io/merlin-extend" -url { - src: - "https://github.com/let-def/merlin-extend/releases/download/v0.5/merlin-extend-v0.5.tbz" - checksum: [ - "sha256=ca3a38c360c7d4827eb4789abf7a6aa4b6e3b4e3c3ef69a5be64dce4601ec227" - "sha512=55c5a3637337abb8ca8db679128a81ca8ccce567bc214d55b2e6444dc0e905b74c64d629bdea2457d0fe4be5306414feefcdbc4d4761fdafd59aa107550936b6" - ] -} diff --git a/fmt.esy.lock/opam/ocaml-migrate-parsetree.1.4.0/opam b/fmt.esy.lock/opam/ocaml-migrate-parsetree.1.4.0/opam deleted file mode 100644 index 66d40ba..0000000 --- a/fmt.esy.lock/opam/ocaml-migrate-parsetree.1.4.0/opam +++ /dev/null @@ -1,37 +0,0 @@ -opam-version: "2.0" -maintainer: "frederic.bour@lakaban.net" -authors: [ - "Frédéric Bour " - "Jérémie Dimino " -] -license: "LGPL-2.1-only with OCaml-LGPL-linking-exception" -homepage: "https://github.com/ocaml-ppx/ocaml-migrate-parsetree" -bug-reports: "https://github.com/ocaml-ppx/ocaml-migrate-parsetree/issues" -dev-repo: "git+https://github.com/ocaml-ppx/ocaml-migrate-parsetree.git" -doc: "https://ocaml-ppx.github.io/ocaml-migrate-parsetree/" -tags: [ "syntax" "org:ocamllabs" ] -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "result" - "ppx_derivers" - "dune" {>= "1.9.0"} - "ocaml" {>= "4.02.3"} -] -synopsis: "Convert OCaml parsetrees between different versions" -description: """ -Convert OCaml parsetrees between different versions - -This library converts parsetrees, outcometree and ast mappers between -different OCaml versions. High-level functions help making PPX -rewriters independent of a compiler version. -""" -url { - src: - "https://github.com/ocaml-ppx/ocaml-migrate-parsetree/releases/download/v1.4.0/ocaml-migrate-parsetree-v1.4.0.tbz" - checksum: [ - "sha256=231fbdc205187b3ee266b535d9cfe44b599067b2f6e97883c782ea7bb577d3b8" - "sha512=61ee91d2d146cc2d2ff2d5dc4ef5dea4dc4d3c8dbd8b4c9586d64b6ad7302327ab35547aa0a5b0103c3f07b66b13d416a1bee6d4d117293cd3cabe44113ec6d4" - ] -} diff --git a/fmt.esy.lock/opam/ocamlbuild.0.14.0/opam b/fmt.esy.lock/opam/ocamlbuild.0.14.0/opam deleted file mode 100644 index 8deabee..0000000 --- a/fmt.esy.lock/opam/ocamlbuild.0.14.0/opam +++ /dev/null @@ -1,36 +0,0 @@ -opam-version: "2.0" -maintainer: "Gabriel Scherer " -authors: ["Nicolas Pouillard" "Berke Durak"] -homepage: "https://github.com/ocaml/ocamlbuild/" -bug-reports: "https://github.com/ocaml/ocamlbuild/issues" -license: "LGPL-2.1-only with OCaml-LGPL-linking-exception" -doc: "https://github.com/ocaml/ocamlbuild/blob/master/manual/manual.adoc" -dev-repo: "git+https://github.com/ocaml/ocamlbuild.git" -build: [ - [ - make - "-f" - "configure.make" - "all" - "OCAMLBUILD_PREFIX=%{prefix}%" - "OCAMLBUILD_BINDIR=%{bin}%" - "OCAMLBUILD_LIBDIR=%{lib}%" - "OCAMLBUILD_MANDIR=%{man}%" - "OCAML_NATIVE=%{ocaml:native}%" - "OCAML_NATIVE_TOOLS=%{ocaml:native}%" - ] - [make "check-if-preinstalled" "all" "opam-install"] -] -conflicts: [ - "base-ocamlbuild" - "ocamlfind" {< "1.6.2"} -] -synopsis: - "OCamlbuild is a build system with builtin rules to easily build most OCaml projects." -depends: [ - "ocaml" {>= "4.03"} -] -url { - src: "https://github.com/ocaml/ocamlbuild/archive/0.14.0.tar.gz" - checksum: "sha256=87b29ce96958096c0a1a8eeafeb6268077b2d11e1bf2b3de0f5ebc9cf8d42e78" -} diff --git a/fmt.esy.lock/opam/ocamlfind.1.8.1/files/ocaml-stub b/fmt.esy.lock/opam/ocamlfind.1.8.1/files/ocaml-stub deleted file mode 100644 index e5ad990..0000000 --- a/fmt.esy.lock/opam/ocamlfind.1.8.1/files/ocaml-stub +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh - -BINDIR=$(dirname "$(command -v ocamlc)") -"$BINDIR/ocaml" -I "$OCAML_TOPLEVEL_PATH" "$@" diff --git a/fmt.esy.lock/opam/ocamlfind.1.8.1/files/ocamlfind.install b/fmt.esy.lock/opam/ocamlfind.1.8.1/files/ocamlfind.install deleted file mode 100644 index 295c625..0000000 --- a/fmt.esy.lock/opam/ocamlfind.1.8.1/files/ocamlfind.install +++ /dev/null @@ -1,6 +0,0 @@ -bin: [ - "src/findlib/ocamlfind" {"ocamlfind"} - "?src/findlib/ocamlfind_opt" {"ocamlfind"} - "?tools/safe_camlp4" -] -toplevel: ["src/findlib/topfind"] diff --git a/fmt.esy.lock/opam/ocamlfind.1.8.1/opam b/fmt.esy.lock/opam/ocamlfind.1.8.1/opam deleted file mode 100644 index d757d66..0000000 --- a/fmt.esy.lock/opam/ocamlfind.1.8.1/opam +++ /dev/null @@ -1,50 +0,0 @@ -opam-version: "2.0" -synopsis: "A library manager for OCaml" -maintainer: "Thomas Gazagnaire " -authors: "Gerd Stolpmann " -homepage: "http://projects.camlcity.org/projects/findlib.html" -bug-reports: "https://gitlab.camlcity.org/gerd/lib-findlib/issues" -dev-repo: "git+https://gitlab.camlcity.org/gerd/lib-findlib.git" -description: """ -Findlib is a library manager for OCaml. It provides a convention how -to store libraries, and a file format ("META") to describe the -properties of libraries. There is also a tool (ocamlfind) for -interpreting the META files, so that it is very easy to use libraries -in programs and scripts. -""" -build: [ - [ - "./configure" - "-bindir" - bin - "-sitelib" - lib - "-mandir" - man - "-config" - "%{lib}%/findlib.conf" - "-no-custom" - "-no-camlp4" {!ocaml:preinstalled & ocaml:version >= "4.02.0"} - "-no-topfind" {ocaml:preinstalled} - ] - [make "all"] - [make "opt"] {ocaml:native} -] -install: [ - [make "install"] - ["install" "-m" "0755" "ocaml-stub" "%{bin}%/ocaml"] {ocaml:preinstalled} -] -depends: [ - "ocaml" {>= "4.00.0"} - "conf-m4" {build} -] -extra-files: [ - ["ocamlfind.install" "md5=06f2c282ab52d93aa6adeeadd82a2543"] - ["ocaml-stub" "md5=181f259c9e0bad9ef523e7d4abfdf87a"] -] -url { - src: "http://download.camlcity.org/download/findlib-1.8.1.tar.gz" - checksum: "md5=18ca650982c15536616dea0e422cbd8c" - mirrors: "http://download2.camlcity.org/download/findlib-1.8.1.tar.gz" -} -depopts: ["graphics"] diff --git a/fmt.esy.lock/opam/ppx_derivers.1.2.1/opam b/fmt.esy.lock/opam/ppx_derivers.1.2.1/opam deleted file mode 100644 index 3d10814..0000000 --- a/fmt.esy.lock/opam/ppx_derivers.1.2.1/opam +++ /dev/null @@ -1,23 +0,0 @@ -opam-version: "2.0" -maintainer: "jeremie@dimino.org" -authors: ["Jérémie Dimino"] -license: "BSD-3-Clause" -homepage: "https://github.com/ocaml-ppx/ppx_derivers" -bug-reports: "https://github.com/ocaml-ppx/ppx_derivers/issues" -dev-repo: "git://github.com/ocaml-ppx/ppx_derivers.git" -build: [ - ["dune" "build" "-p" name "-j" jobs] -] -depends: [ - "ocaml" - "dune" -] -synopsis: "Shared [@@deriving] plugin registry" -description: """ -Ppx_derivers is a tiny package whose sole purpose is to allow -ppx_deriving and ppx_type_conv to inter-operate gracefully when linked -as part of the same ocaml-migrate-parsetree driver.""" -url { - src: "https://github.com/ocaml-ppx/ppx_derivers/archive/1.2.1.tar.gz" - checksum: "md5=5dc2bf130c1db3c731fe0fffc5648b41" -} diff --git a/fmt.esy.lock/opam/result.1.4/opam b/fmt.esy.lock/opam/result.1.4/opam deleted file mode 100644 index b44aeea..0000000 --- a/fmt.esy.lock/opam/result.1.4/opam +++ /dev/null @@ -1,22 +0,0 @@ -opam-version: "2.0" -maintainer: "opensource@janestreet.com" -authors: ["Jane Street Group, LLC "] -homepage: "https://github.com/janestreet/result" -dev-repo: "git+https://github.com/janestreet/result.git" -bug-reports: "https://github.com/janestreet/result/issues" -license: "BSD-3-Clause" -build: [["dune" "build" "-p" name "-j" jobs]] -depends: [ - "ocaml" - "dune" {>= "1.0"} -] -synopsis: "Compatibility Result module" -description: """ -Projects that want to use the new result type defined in OCaml >= 4.03 -while staying compatible with older version of OCaml should use the -Result module defined in this library.""" -url { - src: - "https://github.com/janestreet/result/archive/1.4.tar.gz" - checksum: "md5=d3162dbc501a2af65c8c71e0866541da" -} diff --git a/fmt.esy.lock/overrides/opam__s__dune_opam__c__1.11.3_opam_override/package.json b/fmt.esy.lock/overrides/opam__s__dune_opam__c__1.11.3_opam_override/package.json deleted file mode 100644 index 064c7e3..0000000 --- a/fmt.esy.lock/overrides/opam__s__dune_opam__c__1.11.3_opam_override/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "build": [ - [ - "ocaml", - "bootstrap.ml" - ], - [ - "./boot.exe", - "--release", - "-j", - "4" - ] - ] -} diff --git a/fmt.esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/files/ocamlbuild-0.14.0.patch b/fmt.esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/files/ocamlbuild-0.14.0.patch deleted file mode 100644 index 4d5bea0..0000000 --- a/fmt.esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/files/ocamlbuild-0.14.0.patch +++ /dev/null @@ -1,463 +0,0 @@ ---- ./Makefile -+++ ./Makefile -@@ -213,7 +213,7 @@ - rm -f man/ocamlbuild.1 - - man/options_man.byte: src/ocamlbuild_pack.cmo -- $(OCAMLC) $^ -I src man/options_man.ml -o man/options_man.byte -+ $(OCAMLC) -I +unix unix.cma $^ -I src man/options_man.ml -o man/options_man.byte - - clean:: - rm -f man/options_man.cm* ---- ./src/command.ml -+++ ./src/command.ml -@@ -148,9 +148,10 @@ - let self = string_of_command_spec_with_calls call_with_tags call_with_target resolve_virtuals in - let b = Buffer.create 256 in - (* The best way to prevent bash from switching to its windows-style -- * quote-handling is to prepend an empty string before the command name. *) -+ * quote-handling is to prepend an empty string before the command name. -+ * space seems to work, too - and the ouput is nicer *) - if Sys.os_type = "Win32" then -- Buffer.add_string b "''"; -+ Buffer.add_char b ' '; - let first = ref true in - let put_space () = - if !first then -@@ -260,7 +261,7 @@ - - let execute_many ?(quiet=false) ?(pretend=false) cmds = - add_parallel_stat (List.length cmds); -- let degraded = !*My_unix.is_degraded || Sys.os_type = "Win32" in -+ let degraded = !*My_unix.is_degraded in - let jobs = !jobs in - if jobs < 0 then invalid_arg "jobs < 0"; - let max_jobs = if jobs = 0 then None else Some jobs in ---- ./src/findlib.ml -+++ ./src/findlib.ml -@@ -66,9 +66,6 @@ - (fun command -> lexer & Lexing.from_string & run_and_read command) - command - --let run_and_read command = -- Printf.ksprintf run_and_read command -- - let rec query name = - try - Hashtbl.find packages name -@@ -135,7 +132,8 @@ - with Not_found -> s - - let list () = -- List.map before_space (split_nl & run_and_read "%s list" ocamlfind) -+ let cmd = Shell.quote_filename_if_needed ocamlfind ^ " list" in -+ List.map before_space (split_nl & run_and_read cmd) - - (* The closure algorithm is easy because the dependencies are already closed - and sorted for each package. We only have to make the union. We could also ---- ./src/main.ml -+++ ./src/main.ml -@@ -162,6 +162,9 @@ - Tags.mem "traverse" tags - || List.exists (Pathname.is_prefix path_name) !Options.include_dirs - || List.exists (Pathname.is_prefix path_name) target_dirs) -+ && ((* beware: !Options.build_dir is an absolute directory *) -+ Pathname.normalize !Options.build_dir -+ <> Pathname.normalize (Pathname.pwd/path_name)) - end - end - end ---- ./src/my_std.ml -+++ ./src/my_std.ml -@@ -271,13 +271,107 @@ - try Array.iter (fun x -> if x = basename then raise Exit) a; false - with Exit -> true - -+let command_plain = function -+| [| |] -> 0 -+| margv -> -+ let rec waitpid a b = -+ match Unix.waitpid a b with -+ | exception (Unix.Unix_error(Unix.EINTR,_,_)) -> waitpid a b -+ | x -> x -+ in -+ let pid = Unix.(create_process margv.(0) margv stdin stdout stderr) in -+ let pid', process_status = waitpid [] pid in -+ assert (pid = pid'); -+ match process_status with -+ | Unix.WEXITED n -> n -+ | Unix.WSIGNALED _ -> 2 (* like OCaml's uncaught exceptions *) -+ | Unix.WSTOPPED _ -> 127 -+ -+(* can't use Lexers because of circular dependency *) -+let split_path_win str = -+ let rec aux pos = -+ try -+ let i = String.index_from str pos ';' in -+ let len = i - pos in -+ if len = 0 then -+ aux (succ i) -+ else -+ String.sub str pos (i - pos) :: aux (succ i) -+ with Not_found | Invalid_argument _ -> -+ let len = String.length str - pos in -+ if len = 0 then [] else [String.sub str pos len] -+ in -+ aux 0 -+ -+let windows_shell = lazy begin -+ let rec iter = function -+ | [] -> [| "bash.exe" ; "--norc" ; "--noprofile" |] -+ | hd::tl -> -+ let dash = Filename.concat hd "dash.exe" in -+ if Sys.file_exists dash then [|dash|] else -+ let bash = Filename.concat hd "bash.exe" in -+ if Sys.file_exists bash = false then iter tl else -+ (* if sh.exe and bash.exe exist in the same dir, choose sh.exe *) -+ let sh = Filename.concat hd "sh.exe" in -+ if Sys.file_exists sh then [|sh|] else [|bash ; "--norc" ; "--noprofile"|] -+ in -+ split_path_win (try Sys.getenv "PATH" with Not_found -> "") |> iter -+end -+ -+let prep_windows_cmd cmd = -+ (* workaround known ocaml bug, remove later *) -+ if String.contains cmd '\t' && String.contains cmd ' ' = false then -+ " " ^ cmd -+ else -+ cmd -+ -+let run_with_shell = function -+| "" -> 0 -+| cmd -> -+ let cmd = prep_windows_cmd cmd in -+ let shell = Lazy.force windows_shell in -+ let qlen = Filename.quote cmd |> String.length in -+ (* old versions of dash had problems with bs *) -+ try -+ if qlen < 7_900 then -+ command_plain (Array.append shell [| "-ec" ; cmd |]) -+ else begin -+ (* it can still work, if the called command is a cygwin tool *) -+ let ch_closed = ref false in -+ let file_deleted = ref false in -+ let fln,ch = -+ Filename.open_temp_file -+ ~mode:[Open_binary] -+ "ocamlbuildtmp" -+ ".sh" -+ in -+ try -+ let f_slash = String.map ( fun x -> if x = '\\' then '/' else x ) fln in -+ output_string ch cmd; -+ ch_closed:= true; -+ close_out ch; -+ let ret = command_plain (Array.append shell [| "-e" ; f_slash |]) in -+ file_deleted:= true; -+ Sys.remove fln; -+ ret -+ with -+ | x -> -+ if !ch_closed = false then -+ close_out_noerr ch; -+ if !file_deleted = false then -+ (try Sys.remove fln with _ -> ()); -+ raise x -+ end -+ with -+ | (Unix.Unix_error _) as x -> -+ (* Sys.command doesn't raise an exception, so run_with_shell also won't -+ raise *) -+ Printexc.to_string x ^ ":" ^ cmd |> prerr_endline; -+ 1 -+ - let sys_command = -- match Sys.os_type with -- | "Win32" -> fun cmd -> -- if cmd = "" then 0 else -- let cmd = "bash --norc -c " ^ Filename.quote cmd in -- Sys.command cmd -- | _ -> fun cmd -> if cmd = "" then 0 else Sys.command cmd -+ if Sys.win32 then run_with_shell -+ else fun cmd -> if cmd = "" then 0 else Sys.command cmd - - (* FIXME warning fix and use Filename.concat *) - let filename_concat x y = ---- ./src/my_std.mli -+++ ./src/my_std.mli -@@ -69,3 +69,6 @@ - - val split_ocaml_version : (int * int * int * string) option - (** (major, minor, patchlevel, rest) *) -+ -+val windows_shell : string array Lazy.t -+val prep_windows_cmd : string -> string ---- ./src/ocamlbuild_executor.ml -+++ ./src/ocamlbuild_executor.ml -@@ -34,6 +34,8 @@ - job_stdin : out_channel; - job_stderr : in_channel; - job_buffer : Buffer.t; -+ job_pid : int; -+ job_tmp_file: string option; - mutable job_dying : bool; - };; - -@@ -76,6 +78,61 @@ - in - loop 0 - ;; -+ -+let open_process_full_win cmd env = -+ let (in_read, in_write) = Unix.pipe () in -+ let (out_read, out_write) = Unix.pipe () in -+ let (err_read, err_write) = Unix.pipe () in -+ Unix.set_close_on_exec in_read; -+ Unix.set_close_on_exec out_write; -+ Unix.set_close_on_exec err_read; -+ let inchan = Unix.in_channel_of_descr in_read in -+ let outchan = Unix.out_channel_of_descr out_write in -+ let errchan = Unix.in_channel_of_descr err_read in -+ let shell = Lazy.force Ocamlbuild_pack.My_std.windows_shell in -+ let test_cmd = -+ String.concat " " (List.map Filename.quote (Array.to_list shell)) ^ -+ "-ec " ^ -+ Filename.quote (Ocamlbuild_pack.My_std.prep_windows_cmd cmd) in -+ let argv,tmp_file = -+ if String.length test_cmd < 7_900 then -+ Array.append -+ shell -+ [| "-ec" ; Ocamlbuild_pack.My_std.prep_windows_cmd cmd |],None -+ else -+ let fln,ch = Filename.open_temp_file ~mode:[Open_binary] "ocamlbuild" ".sh" in -+ output_string ch (Ocamlbuild_pack.My_std.prep_windows_cmd cmd); -+ close_out ch; -+ let fln' = String.map (function '\\' -> '/' | c -> c) fln in -+ Array.append -+ shell -+ [| "-c" ; fln' |], Some fln in -+ let pid = -+ Unix.create_process_env argv.(0) argv env out_read in_write err_write in -+ Unix.close out_read; -+ Unix.close in_write; -+ Unix.close err_write; -+ (pid, inchan, outchan, errchan,tmp_file) -+ -+let close_process_full_win (pid,inchan, outchan, errchan, tmp_file) = -+ let delete tmp_file = -+ match tmp_file with -+ | None -> () -+ | Some x -> try Sys.remove x with Sys_error _ -> () in -+ let tmp_file_deleted = ref false in -+ try -+ close_in inchan; -+ close_out outchan; -+ close_in errchan; -+ let res = snd(Unix.waitpid [] pid) in -+ tmp_file_deleted := true; -+ delete tmp_file; -+ res -+ with -+ | x when tmp_file <> None && !tmp_file_deleted = false -> -+ delete tmp_file; -+ raise x -+ - (* ***) - (*** execute *) - (* XXX: Add test for non reentrancy *) -@@ -130,10 +187,16 @@ - (*** add_job *) - let add_job cmd rest result id = - (*display begin fun oc -> fp oc "Job %a is %s\n%!" print_job_id id cmd; end;*) -- let (stdout', stdin', stderr') = open_process_full cmd env in -+ let (pid,stdout', stdin', stderr', tmp_file) = -+ if Sys.win32 then open_process_full_win cmd env else -+ let a,b,c = open_process_full cmd env in -+ -1,a,b,c,None -+ in - incr jobs_active; -- set_nonblock (doi stdout'); -- set_nonblock (doi stderr'); -+ if not Sys.win32 then ( -+ set_nonblock (doi stdout'); -+ set_nonblock (doi stderr'); -+ ); - let job = - { job_id = id; - job_command = cmd; -@@ -143,7 +206,9 @@ - job_stdin = stdin'; - job_stderr = stderr'; - job_buffer = Buffer.create 1024; -- job_dying = false } -+ job_dying = false; -+ job_tmp_file = tmp_file; -+ job_pid = pid } - in - outputs := FDM.add (doi stdout') job (FDM.add (doi stderr') job !outputs); - jobs := JS.add job !jobs; -@@ -199,6 +264,7 @@ - try - read fd u 0 (Bytes.length u) - with -+ | Unix.Unix_error(Unix.EPIPE,_,_) when Sys.win32 -> 0 - | Unix.Unix_error(e,_,_) -> - let msg = error_message e in - display (fun oc -> fp oc -@@ -241,14 +307,19 @@ - decr jobs_active; - - (* PR#5371: we would get EAGAIN below otherwise *) -- clear_nonblock (doi job.job_stdout); -- clear_nonblock (doi job.job_stderr); -- -+ if not Sys.win32 then ( -+ clear_nonblock (doi job.job_stdout); -+ clear_nonblock (doi job.job_stderr); -+ ); - do_read ~loop:true (doi job.job_stdout) job; - do_read ~loop:true (doi job.job_stderr) job; - outputs := FDM.remove (doi job.job_stdout) (FDM.remove (doi job.job_stderr) !outputs); - jobs := JS.remove job !jobs; -- let status = close_process_full (job.job_stdout, job.job_stdin, job.job_stderr) in -+ let status = -+ if Sys.win32 then -+ close_process_full_win (job.job_pid, job.job_stdout, job.job_stdin, job.job_stderr, job.job_tmp_file) -+ else -+ close_process_full (job.job_stdout, job.job_stdin, job.job_stderr) in - - let shown = ref false in - ---- ./src/ocamlbuild_unix_plugin.ml -+++ ./src/ocamlbuild_unix_plugin.ml -@@ -48,12 +48,22 @@ - end - - let run_and_open s kont = -+ let s_orig = s in -+ let s = -+ (* Be consistent! My_unix.run_and_open uses My_std.sys_command and -+ sys_command uses bash. *) -+ if Sys.win32 = false then s else -+ let l = match Lazy.force My_std.windows_shell |> Array.to_list with -+ | hd::tl -> (Filename.quote hd)::tl -+ | _ -> assert false in -+ "\"" ^ (String.concat " " l) ^ " -ec " ^ Filename.quote (" " ^ s) ^ "\"" -+ in - let ic = Unix.open_process_in s in - let close () = - match Unix.close_process_in ic with - | Unix.WEXITED 0 -> () - | Unix.WEXITED _ | Unix.WSIGNALED _ | Unix.WSTOPPED _ -> -- failwith (Printf.sprintf "Error while running: %s" s) in -+ failwith (Printf.sprintf "Error while running: %s" s_orig) in - let res = try - kont ic - with e -> (close (); raise e) ---- ./src/options.ml -+++ ./src/options.ml -@@ -174,11 +174,24 @@ - build_dir := Filename.concat (Sys.getcwd ()) s - else - build_dir := s -+ -+let slashify = -+ if Sys.win32 then fun p -> String.map (function '\\' -> '/' | x -> x) p -+ else fun p ->p -+ -+let sb () = -+ match Sys.os_type with -+ | "Win32" -> -+ (try set_binary_mode_out stdout true with _ -> ()); -+ | _ -> () -+ -+ - let spec = ref ( - let print_version () = -+ sb (); - Printf.printf "ocamlbuild %s\n%!" Ocamlbuild_config.version; raise Exit_OK - in -- let print_vnum () = print_endline Ocamlbuild_config.version; raise Exit_OK in -+ let print_vnum () = sb (); print_endline Ocamlbuild_config.version; raise Exit_OK in - Arg.align - [ - "-version", Unit print_version , " Display the version"; -@@ -257,8 +270,8 @@ - "-build-dir", String set_build_dir, " Set build directory (implies no-links)"; - "-install-lib-dir", Set_string Ocamlbuild_where.libdir, " Set the install library directory"; - "-install-bin-dir", Set_string Ocamlbuild_where.bindir, " Set the install binary directory"; -- "-where", Unit (fun () -> print_endline !Ocamlbuild_where.libdir; raise Exit_OK), " Display the install library directory"; -- "-which", String (fun cmd -> print_endline (find_tool cmd); raise Exit_OK), " Display path to the tool command"; -+ "-where", Unit (fun () -> sb (); print_endline (slashify !Ocamlbuild_where.libdir); raise Exit_OK), " Display the install library directory"; -+ "-which", String (fun cmd -> sb (); print_endline (slashify (find_tool cmd)); raise Exit_OK), " Display path to the tool command"; - "-ocamlc", set_cmd ocamlc, " Set the OCaml bytecode compiler"; - "-plugin-ocamlc", set_cmd plugin_ocamlc, " Set the OCaml bytecode compiler \ - used when building myocamlbuild.ml (only)"; ---- ./src/pathname.ml -+++ ./src/pathname.ml -@@ -84,6 +84,26 @@ - | x :: xs -> x :: normalize_list xs - - let normalize x = -+ let x = -+ if Sys.win32 = false then -+ x -+ else -+ let len = String.length x in -+ let b = Bytes.create len in -+ for i = 0 to pred len do -+ match x.[i] with -+ | '\\' -> Bytes.set b i '/' -+ | c -> Bytes.set b i c -+ done; -+ if len > 1 then ( -+ let c1 = Bytes.get b 0 in -+ let c2 = Bytes.get b 1 in -+ if c2 = ':' && c1 >= 'a' && c1 <= 'z' && -+ ( len = 2 || Bytes.get b 2 = '/') then -+ Bytes.set b 0 (Char.uppercase_ascii c1) -+ ); -+ Bytes.unsafe_to_string b -+ in - if Glob.eval not_normal_form_re x then - let root, paths = split x in - join root (normalize_list paths) ---- ./src/shell.ml -+++ ./src/shell.ml -@@ -24,12 +24,26 @@ - | 'a'..'z' | 'A'..'Z' | '0'..'9' | '.' | '-' | '/' | '_' | ':' | '@' | '+' | ',' -> loop (pos + 1) - | _ -> false in - loop 0 -+ -+let generic_quote quotequote s = -+ let l = String.length s in -+ let b = Buffer.create (l + 20) in -+ Buffer.add_char b '\''; -+ for i = 0 to l - 1 do -+ if s.[i] = '\'' -+ then Buffer.add_string b quotequote -+ else Buffer.add_char b s.[i] -+ done; -+ Buffer.add_char b '\''; -+ Buffer.contents b -+let unix_quote = generic_quote "'\\''" -+ - let quote_filename_if_needed s = - if is_simple_filename s then s - (* We should probably be using [Filename.unix_quote] except that function - * isn't exported. Users on Windows will have to live with not being able to - * install OCaml into c:\o'caml. Too bad. *) -- else if Sys.os_type = "Win32" then Printf.sprintf "'%s'" s -+ else if Sys.os_type = "Win32" then unix_quote s - else Filename.quote s - let chdir dir = - reset_filesys_cache (); -@@ -37,7 +51,7 @@ - let run args target = - reset_readdir_cache (); - let cmd = String.concat " " (List.map quote_filename_if_needed args) in -- if !*My_unix.is_degraded || Sys.os_type = "Win32" then -+ if !*My_unix.is_degraded then - begin - Log.event cmd target Tags.empty; - let st = sys_command cmd in diff --git a/fmt.esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/package.json b/fmt.esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/package.json deleted file mode 100644 index b24be7b..0000000 --- a/fmt.esy.lock/overrides/opam__s__ocamlbuild_opam__c__0.14.0_opam_override/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "build": [ - [ - "bash", - "-c", - "#{os == 'windows' ? 'patch -p1 < ocamlbuild-0.14.0.patch' : 'true'}" - ], - [ - "make", - "-f", - "configure.make", - "all", - "OCAMLBUILD_PREFIX=#{self.install}", - "OCAMLBUILD_BINDIR=#{self.bin}", - "OCAMLBUILD_LIBDIR=#{self.lib}", - "OCAMLBUILD_MANDIR=#{self.man}", - "OCAMLBUILD_NATIVE=true", - "OCAMLBUILD_NATIVE_TOOLS=true" - ], - [ - "make", - "check-if-preinstalled", - "all", - "#{os == 'windows' ? 'install' : 'opam-install'}" - ] - ] -} diff --git a/fmt.esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/files/findlib-1.8.1.patch b/fmt.esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/files/findlib-1.8.1.patch deleted file mode 100644 index 3e3ee5a..0000000 --- a/fmt.esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/files/findlib-1.8.1.patch +++ /dev/null @@ -1,471 +0,0 @@ ---- ./Makefile -+++ ./Makefile -@@ -57,16 +57,16 @@ - cat findlib.conf.in | \ - $(SH) tools/patch '@SITELIB@' '$(OCAML_SITELIB)' >findlib.conf - if ./tools/cmd_from_same_dir ocamlc; then \ -- echo 'ocamlc="ocamlc.opt"' >>findlib.conf; \ -+ echo 'ocamlc="ocamlc.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ - fi - if ./tools/cmd_from_same_dir ocamlopt; then \ -- echo 'ocamlopt="ocamlopt.opt"' >>findlib.conf; \ -+ echo 'ocamlopt="ocamlopt.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ - fi - if ./tools/cmd_from_same_dir ocamldep; then \ -- echo 'ocamldep="ocamldep.opt"' >>findlib.conf; \ -+ echo 'ocamldep="ocamldep.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ - fi - if ./tools/cmd_from_same_dir ocamldoc; then \ -- echo 'ocamldoc="ocamldoc.opt"' >>findlib.conf; \ -+ echo 'ocamldoc="ocamldoc.opt$(EXEC_SUFFIX)"' >>findlib.conf; \ - fi - - .PHONY: install-doc ---- ./src/findlib/findlib_config.mlp -+++ ./src/findlib/findlib_config.mlp -@@ -24,3 +24,5 @@ - | "MacOS" -> "" (* don't know *) - | _ -> failwith "Unknown Sys.os_type" - ;; -+ -+let exec_suffix = "@EXEC_SUFFIX@";; ---- ./src/findlib/findlib.ml -+++ ./src/findlib/findlib.ml -@@ -28,15 +28,20 @@ - let conf_ldconf = ref "";; - let conf_ignore_dups_in = ref ([] : string list);; - --let ocamlc_default = "ocamlc";; --let ocamlopt_default = "ocamlopt";; --let ocamlcp_default = "ocamlcp";; --let ocamloptp_default = "ocamloptp";; --let ocamlmklib_default = "ocamlmklib";; --let ocamlmktop_default = "ocamlmktop";; --let ocamldep_default = "ocamldep";; --let ocamlbrowser_default = "ocamlbrowser";; --let ocamldoc_default = "ocamldoc";; -+let add_exec str = -+ match Findlib_config.exec_suffix with -+ | "" -> str -+ | a -> str ^ a ;; -+let ocamlc_default = add_exec "ocamlc";; -+let ocamlopt_default = add_exec "ocamlopt";; -+let ocamlcp_default = add_exec "ocamlcp";; -+let ocamloptp_default = add_exec "ocamloptp";; -+let ocamlmklib_default = add_exec "ocamlmklib";; -+let ocamlmktop_default = add_exec "ocamlmktop";; -+let ocamldep_default = add_exec "ocamldep";; -+let ocamlbrowser_default = add_exec "ocamlbrowser";; -+let ocamldoc_default = add_exec "ocamldoc";; -+ - - - let init_manually ---- ./src/findlib/fl_package_base.ml -+++ ./src/findlib/fl_package_base.ml -@@ -133,7 +133,15 @@ - List.find (fun def -> def.def_var = "exists_if") p.package_defs in - let files = Fl_split.in_words def.def_value in - List.exists -- (fun file -> Sys.file_exists (Filename.concat d' file)) -+ (fun file -> -+ let fln = Filename.concat d' file in -+ let e = Sys.file_exists fln in -+ (* necessary for ppx executables *) -+ if e || Sys.os_type <> "Win32" || Filename.check_suffix fln ".exe" then -+ e -+ else -+ Sys.file_exists (fln ^ ".exe") -+ ) - files - with Not_found -> true in - ---- ./src/findlib/fl_split.ml -+++ ./src/findlib/fl_split.ml -@@ -126,10 +126,17 @@ - | '/' | '\\' -> true - | _ -> false in - let norm_dir_win() = -- if l >= 1 && s.[0] = '/' then -- Buffer.add_char b '\\' else Buffer.add_char b s.[0]; -- if l >= 2 && s.[1] = '/' then -- Buffer.add_char b '\\' else Buffer.add_char b s.[1]; -+ if l >= 1 then ( -+ if s.[0] = '/' then -+ Buffer.add_char b '\\' -+ else -+ Buffer.add_char b s.[0] ; -+ if l >= 2 then -+ if s.[1] = '/' then -+ Buffer.add_char b '\\' -+ else -+ Buffer.add_char b s.[1]; -+ ); - for k = 2 to l - 1 do - let c = s.[k] in - if is_slash c then ( ---- ./src/findlib/frontend.ml -+++ ./src/findlib/frontend.ml -@@ -31,10 +31,18 @@ - else - Sys_error (arg ^ ": " ^ Unix.error_message code) - -+let is_win = Sys.os_type = "Win32" -+ -+let () = -+ match Findlib_config.system with -+ | "win32" | "win64" | "mingw" | "cygwin" | "mingw64" | "cygwin64" -> -+ (try set_binary_mode_out stdout true with _ -> ()); -+ (try set_binary_mode_out stderr true with _ -> ()); -+ | _ -> () - - let slashify s = - match Findlib_config.system with -- | "mingw" | "mingw64" | "cygwin" -> -+ | "win32" | "win64" | "mingw" | "cygwin" | "mingw64" | "cygwin64" -> - let b = Buffer.create 80 in - String.iter - (function -@@ -49,7 +57,7 @@ - - let out_path ?(prefix="") s = - match Findlib_config.system with -- | "mingw" | "mingw64" | "cygwin" -> -+ | "win32" | "win64" | "mingw" | "mingw64" | "cygwin" -> - let u = slashify s in - prefix ^ - (if String.contains u ' ' then -@@ -273,11 +281,9 @@ - - - let identify_dir d = -- match Sys.os_type with -- | "Win32" -> -- failwith "identify_dir" (* not available *) -- | _ -> -- let s = Unix.stat d in -+ if is_win then -+ failwith "identify_dir"; (* not available *) -+ let s = Unix.stat d in - (s.Unix.st_dev, s.Unix.st_ino) - ;; - -@@ -459,6 +465,96 @@ - ) - packages - -+let rewrite_cmd s = -+ if s = "" || not is_win then -+ s -+ else -+ let s = -+ let l = String.length s in -+ let b = Buffer.create l in -+ for i = 0 to pred l do -+ match s.[i] with -+ | '/' -> Buffer.add_char b '\\' -+ | x -> Buffer.add_char b x -+ done; -+ Buffer.contents b -+ in -+ if (Filename.is_implicit s && String.contains s '\\' = false) || -+ Filename.check_suffix (String.lowercase s) ".exe" then -+ s -+ else -+ let s' = s ^ ".exe" in -+ if Sys.file_exists s' then -+ s' -+ else -+ s -+ -+let rewrite_cmd s = -+ if s = "" || not is_win then s else -+ let s = -+ let l = String.length s in -+ let b = Buffer.create l in -+ for i = 0 to pred l do -+ match s.[i] with -+ | '/' -> Buffer.add_char b '\\' -+ | x -> Buffer.add_char b x -+ done; -+ Buffer.contents b -+ in -+ if (Filename.is_implicit s && String.contains s '\\' = false) || -+ Filename.check_suffix (String.lowercase s) ".exe" then -+ s -+ else -+ let s' = s ^ ".exe" in -+ if Sys.file_exists s' then -+ s' -+ else -+ s -+ -+let rewrite_pp cmd = -+ if not is_win then cmd else -+ let module T = struct exception Keep end in -+ let is_whitespace = function -+ | ' ' | '\011' | '\012' | '\n' | '\r' | '\t' -> true -+ | _ -> false in -+ (* characters that triggers special behaviour (cmd.exe, not unix shell) *) -+ let is_unsafe_char = function -+ | '(' | ')' | '%' | '!' | '^' | '<' | '>' | '&' -> true -+ | _ -> false in -+ let len = String.length cmd in -+ let buf = Buffer.create (len + 4) in -+ let buf_cmd = Buffer.create len in -+ let rec iter_ws i = -+ if i >= len then () else -+ let cur = cmd.[i] in -+ if is_whitespace cur then ( -+ Buffer.add_char buf cur; -+ iter_ws (succ i) -+ ) -+ else -+ iter_cmd i -+ and iter_cmd i = -+ if i >= len then add_buf_cmd () else -+ let cur = cmd.[i] in -+ if is_unsafe_char cur || cur = '"' || cur = '\'' then -+ raise T.Keep; -+ if is_whitespace cur then ( -+ add_buf_cmd (); -+ Buffer.add_substring buf cmd i (len - i) -+ ) -+ else ( -+ Buffer.add_char buf_cmd cur; -+ iter_cmd (succ i) -+ ) -+ and add_buf_cmd () = -+ if Buffer.length buf_cmd > 0 then -+ Buffer.add_string buf (rewrite_cmd (Buffer.contents buf_cmd)) -+ in -+ try -+ iter_ws 0; -+ Buffer.contents buf -+ with -+ | T.Keep -> cmd - - let process_pp_spec syntax_preds packages pp_opts = - (* Returns: pp_command *) -@@ -549,7 +645,7 @@ - None -> [] - | Some cmd -> - ["-pp"; -- cmd ^ " " ^ -+ (rewrite_cmd cmd) ^ " " ^ - String.concat " " (List.map Filename.quote pp_i_options) ^ " " ^ - String.concat " " (List.map Filename.quote pp_archives) ^ " " ^ - String.concat " " (List.map Filename.quote pp_opts)] -@@ -625,9 +721,11 @@ - in - try - let preprocessor = -+ rewrite_cmd ( - resolve_path - ~base ~explicit:true -- (package_property predicates pname "ppx") in -+ (package_property predicates pname "ppx") ) -+ in - ["-ppx"; String.concat " " (preprocessor :: options)] - with Not_found -> [] - ) -@@ -895,6 +993,14 @@ - switch (e.g. -L instead of -L ) - *) - -+(* We may need to remove files on which we do not have complete control. -+ On Windows, removing a read-only file fails so try to change the -+ mode of the file first. *) -+let remove_file fname = -+ try Sys.remove fname -+ with Sys_error _ when is_win -> -+ (try Unix.chmod fname 0o666 with Unix.Unix_error _ -> ()); -+ Sys.remove fname - - let ocamlc which () = - -@@ -1022,9 +1128,12 @@ - - "-intf", - Arg.String (fun s -> pass_files := !pass_files @ [ Intf(slashify s) ]); -- -+ - "-pp", -- Arg.String (fun s -> pp_specified := true; add_spec_fn "-pp" s); -+ Arg.String (fun s -> pp_specified := true; add_spec_fn "-pp" (rewrite_pp s)); -+ -+ "-ppx", -+ Arg.String (fun s -> add_spec_fn "-ppx" (rewrite_pp s)); - - "-thread", - Arg.Unit (fun _ -> threads := threads_default); -@@ -1237,7 +1346,7 @@ - with - any -> - close_out initl; -- Sys.remove initl_file_name; -+ remove_file initl_file_name; - raise any - end; - -@@ -1245,9 +1354,9 @@ - at_exit - (fun () -> - let tr f x = try f x with _ -> () in -- tr Sys.remove initl_file_name; -- tr Sys.remove (Filename.chop_extension initl_file_name ^ ".cmi"); -- tr Sys.remove (Filename.chop_extension initl_file_name ^ ".cmo"); -+ tr remove_file initl_file_name; -+ tr remove_file (Filename.chop_extension initl_file_name ^ ".cmi"); -+ tr remove_file (Filename.chop_extension initl_file_name ^ ".cmo"); - ); - - let exclude_list = [ stdlibdir; threads_dir; vmthreads_dir ] in -@@ -1493,7 +1602,9 @@ - [ "-v", Arg.Unit (fun () -> verbose := Verbose); - "-pp", Arg.String (fun s -> - pp_specified := true; -- options := !options @ ["-pp"; s]); -+ options := !options @ ["-pp"; rewrite_pp s]); -+ "-ppx", Arg.String (fun s -> -+ options := !options @ ["-ppx"; rewrite_pp s]); - ] - ) - ) -@@ -1672,7 +1783,9 @@ - Arg.String (fun s -> add_spec_fn "-I" (slashify (resolve_path s))); - - "-pp", Arg.String (fun s -> pp_specified := true; -- add_spec_fn "-pp" s); -+ add_spec_fn "-pp" (rewrite_pp s)); -+ "-ppx", Arg.String (fun s -> add_spec_fn "-ppx" (rewrite_pp s)); -+ - ] - ) - ) -@@ -1830,7 +1943,10 @@ - output_string ch_out append; - close_out ch_out; - close_in ch_in; -- Unix.utimes outpath s.Unix.st_mtime s.Unix.st_mtime; -+ (try Unix.utimes outpath s.Unix.st_mtime s.Unix.st_mtime -+ with Unix.Unix_error(e,_,_) -> -+ prerr_endline("Warning: setting utimes for " ^ outpath -+ ^ ": " ^ Unix.error_message e)); - - prerr_endline("Installed " ^ outpath); - with -@@ -1882,6 +1998,8 @@ - Unix.openfile (Filename.concat dir owner_file) [Unix.O_RDONLY] 0 in - let f = - Unix.in_channel_of_descr fd in -+ if is_win then -+ set_binary_mode_in f false; - try - let line = input_line f in - let is_my_file = (line = pkg) in -@@ -2208,7 +2326,7 @@ - let lines = read_ldconf !ldconf in - let dlldir_norm = Fl_split.norm_dir dlldir in - let dlldir_norm_lc = string_lowercase_ascii dlldir_norm in -- let ci_filesys = (Sys.os_type = "Win32") in -+ let ci_filesys = is_win in - let check_dir d = - let d' = Fl_split.norm_dir d in - (d' = dlldir_norm) || -@@ -2356,7 +2474,7 @@ - List.iter - (fun file -> - let absfile = Filename.concat dlldir file in -- Sys.remove absfile; -+ remove_file absfile; - prerr_endline ("Removed " ^ absfile) - ) - dll_files -@@ -2365,7 +2483,7 @@ - (* Remove the files from the package directory: *) - if Sys.file_exists pkgdir then begin - let files = Sys.readdir pkgdir in -- Array.iter (fun f -> Sys.remove (Filename.concat pkgdir f)) files; -+ Array.iter (fun f -> remove_file (Filename.concat pkgdir f)) files; - Unix.rmdir pkgdir; - prerr_endline ("Removed " ^ pkgdir) - end -@@ -2415,7 +2533,9 @@ - - - let print_configuration() = -+ let sl = slashify in - let dir s = -+ let s = sl s in - if Sys.file_exists s then - s - else -@@ -2453,27 +2573,27 @@ - if md = "" then "the corresponding package directories" else dir md - ); - Printf.printf "The standard library is assumed to reside in:\n %s\n" -- (Findlib.ocaml_stdlib()); -+ (sl (Findlib.ocaml_stdlib())); - Printf.printf "The ld.conf file can be found here:\n %s\n" -- (Findlib.ocaml_ldconf()); -+ (sl (Findlib.ocaml_ldconf())); - flush stdout - | Some "conf" -> -- print_endline (Findlib.config_file()) -+ print_endline (sl (Findlib.config_file())) - | Some "path" -> -- List.iter print_endline (Findlib.search_path()) -+ List.iter ( fun x -> print_endline (sl x)) (Findlib.search_path()) - | Some "destdir" -> -- print_endline (Findlib.default_location()) -+ print_endline ( sl (Findlib.default_location())) - | Some "metadir" -> -- print_endline (Findlib.meta_directory()) -+ print_endline ( sl (Findlib.meta_directory())) - | Some "metapath" -> - let mdir = Findlib.meta_directory() in - let ddir = Findlib.default_location() in -- print_endline -- (if mdir <> "" then mdir ^ "/META.%s" else ddir ^ "/%s/META") -+ print_endline ( sl -+ (if mdir <> "" then mdir ^ "/META.%s" else ddir ^ "/%s/META")) - | Some "stdlib" -> -- print_endline (Findlib.ocaml_stdlib()) -+ print_endline ( sl (Findlib.ocaml_stdlib())) - | Some "ldconf" -> -- print_endline (Findlib.ocaml_ldconf()) -+ print_endline ( sl (Findlib.ocaml_ldconf())) - | _ -> - assert false - ;; -@@ -2481,7 +2601,7 @@ - - let ocamlcall pkg cmd = - let dir = package_directory pkg in -- let path = Filename.concat dir cmd in -+ let path = rewrite_cmd (Filename.concat dir cmd) in - begin - try Unix.access path [ Unix.X_OK ] - with -@@ -2647,6 +2767,10 @@ - | Sys_error f -> - prerr_endline ("ocamlfind: " ^ f); - exit 2 -+ | Unix.Unix_error (e, fn, f) -> -+ prerr_endline ("ocamlfind: " ^ fn ^ " " ^ f -+ ^ ": " ^ Unix.error_message e); -+ exit 2 - | Findlib.No_such_package(pkg,info) -> - prerr_endline ("ocamlfind: Package `" ^ pkg ^ "' not found" ^ - (if info <> "" then " - " ^ info else "")); ---- ./src/findlib/Makefile -+++ ./src/findlib/Makefile -@@ -90,6 +90,7 @@ - cat findlib_config.mlp | \ - $(SH) $(TOP)/tools/patch '@CONFIGFILE@' '$(OCAMLFIND_CONF)' | \ - $(SH) $(TOP)/tools/patch '@STDLIB@' '$(OCAML_CORE_STDLIB)' | \ -+ $(SH) $(TOP)/tools/patch '@EXEC_SUFFIX@' '$(EXEC_SUFFIX)' | \ - sed -e 's;@AUTOLINK@;$(OCAML_AUTOLINK);g' \ - -e 's;@SYSTEM@;$(SYSTEM);g' \ - >findlib_config.ml diff --git a/fmt.esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/package.json b/fmt.esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/package.json deleted file mode 100644 index 9314f87..0000000 --- a/fmt.esy.lock/overrides/opam__s__ocamlfind_opam__c__1.8.1_opam_override/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "build": [ - [ - "bash", - "-c", - "#{os == 'windows' ? 'patch -p1 < findlib-1.8.1.patch' : 'true'}" - ], - [ - "./configure", - "-bindir", - "#{self.bin}", - "-sitelib", - "#{self.lib}", - "-mandir", - "#{self.man}", - "-config", - "#{self.lib}/findlib.conf", - "-no-custom", - "-no-topfind" - ], - [ - "make", - "all" - ], - [ - "make", - "opt" - ] - ], - "install": [ - [ - "make", - "install" - ], - [ - "install", - "-m", - "0755", - "ocaml-stub", - "#{self.bin}/ocaml" - ], - [ - "mkdir", - "-p", - "#{self.toplevel}" - ], - [ - "install", - "-m", - "0644", - "src/findlib/topfind", - "#{self.toplevel}/topfind" - ] - ], - "exportedEnv": { - "OCAML_TOPLEVEL_PATH": { - "val": "#{self.toplevel}", - "scope": "global" - } - } -} diff --git a/fmt.json b/fmt.json deleted file mode 100644 index d09ac7a..0000000 --- a/fmt.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "devDependencies": { - "ocaml": "~4.6.0", - "@esy-ocaml/reason": "*" - } -} diff --git a/fnm-manifest.rc b/fnm-manifest.rc new file mode 100644 index 0000000..cb2a2e6 --- /dev/null +++ b/fnm-manifest.rc @@ -0,0 +1,2 @@ +#define RT_MANIFEST 24 +1 RT_MANIFEST "fnm.manifest" \ No newline at end of file diff --git a/fnm.manifest b/fnm.manifest new file mode 100644 index 0000000..4a2fe9d --- /dev/null +++ b/fnm.manifest @@ -0,0 +1,11 @@ + + + + + true + + + diff --git a/fnm.opam b/fnm.opam deleted file mode 100644 index e69de29..0000000 diff --git a/library/Compression.re b/library/Compression.re deleted file mode 100644 index b999670..0000000 --- a/library/Compression.re +++ /dev/null @@ -1,15 +0,0 @@ -let extractFile = (~into as destination, filepath) => { - let%lwt _ = System.mkdirp(destination); - let%lwt _ = - System.unix_exec( - "tar", - ~args=[|"-xvf", filepath, "--directory", destination|], - ~stderr=`Dev_null, - ); - let%lwt files = Fs.readdir(destination); - let filename = List.hd(files); - Lwt_unix.rename( - Filename.concat(destination, filename), - Filename.concat(destination, "installation"), - ); -}; diff --git a/library/Config.re b/library/Config.re deleted file mode 100644 index 48a94a0..0000000 --- a/library/Config.re +++ /dev/null @@ -1,111 +0,0 @@ -type variable_doc('t) = { - name: string, - doc: string, - default: string, -}; - -module EnvVar = - ( - M: { - type t; - let name: string; - let doc: string; - let default: t; - let parse: string => t; - let unparse: t => string; - }, - ) => { - include M; - let optValue = Sys.getenv_opt(name) |> Opt.map(parse); - let getOpt = () => optValue; - let get = () => Opt.(getOpt() or default); - let docInfo = {name, doc, default: unparse(default)}; -}; - -let ensureTrailingBackslash = str => - switch (str.[String.length(str) - 1]) { - | '/' => str - | _ => str ++ "/" - }; - -module FNM_NODE_DIST_MIRROR = - EnvVar({ - type t = string; - let name = "FNM_NODE_DIST_MIRROR"; - let doc = "https://nodejs.org/dist/ mirror"; - let default = "https://nodejs.org/dist/"; - let parse = ensureTrailingBackslash; - let unparse = ensureTrailingBackslash; - }); - -module FNM_DIR = - EnvVar({ - type t = string; - let parse = ensureTrailingBackslash; - let unparse = ensureTrailingBackslash; - let name = "FNM_DIR"; - let doc = "The root directory of fnm installations."; - let default = { - let home = - Sys.getenv_opt("HOME") - |> Opt.orThrow("There isn't $HOME environment variable set."); - Filename.concat(home, ".fnm"); - }; - }); - -module FNM_MULTISHELL_PATH = - EnvVar({ - type t = string; - let parse = x => x; - let unparse = x => x; - let name = "FNM_MULTISHELL_PATH"; - let doc = "Where the current node version link is stored"; - let default = ""; - }); - -module FNM_LOGLEVEL = - EnvVar({ - type t = LogLevel.t; - let parse = LogLevel.fromString; - let unparse = LogLevel.toString; - let name = "FNM_LOGLEVEL"; - let doc = "The log level of fnm commands"; - let default = LogLevel.Info; - }); - -let parseBooleanOrDie = (~name, str) => - switch (bool_of_string_opt(str)) { - | Some(boolean) => boolean - | None => - let errorString = - - str - " isn't a valid option for " - name - " which assumes a boolean value. Consider passing " - "true" - " or " - "false" - "." - ; - Printf.eprintf("%s\n", errorString); - exit(1); - }; - -module FNM_INTERACTIVE_CLI = - EnvVar({ - type t = bool; - let default = Unix.(isatty(stdin) && isatty(stdout) && isatty(stderr)); - let unparse = string_of_bool; - let name = "FNM_INTERACTIVE_CLI"; - let doc = "Should the CLI be interactive? true/false"; - let parse = parseBooleanOrDie(~name); - }); - -let getDocs = () => [ - FNM_DIR.docInfo, - FNM_NODE_DIST_MIRROR.docInfo, - FNM_MULTISHELL_PATH.docInfo, - FNM_INTERACTIVE_CLI.docInfo, - FNM_LOGLEVEL.docInfo, -]; diff --git a/library/Directories.re b/library/Directories.re deleted file mode 100644 index c96d8b1..0000000 --- a/library/Directories.re +++ /dev/null @@ -1,8 +0,0 @@ -let sfwRoot = Config.FNM_DIR.get(); -let nodeVersions = Filename.concat(sfwRoot, "node-versions"); -let globalCurrentVersion = Filename.concat(sfwRoot, "current"); -let currentVersion = - Opt.(Sys.getenv_opt("FNM_MULTISHELL_PATH") or globalCurrentVersion); -let downloads = Filename.concat(sfwRoot, "downloads"); -let aliases = Filename.concat(sfwRoot, "aliases"); -let defaultVersion = Filename.concat(aliases, "default"); diff --git a/library/Dotfiles.re b/library/Dotfiles.re deleted file mode 100644 index 75ebc82..0000000 --- a/library/Dotfiles.re +++ /dev/null @@ -1,29 +0,0 @@ -exception Version_Not_Provided; -exception Conflicting_Dotfiles_Found(string, string); - -let versionString = fileName => { - try%lwt( - Lwt_io.lines_of_file(fileName) - |> Lwt_stream.to_list - |> Lwt.map(List.hd) - |> Lwt.map(String.trim) - |> Lwt.map(versionString => Some(versionString)) - ) { - | Unix.Unix_error(Unix.ENOENT, _, _) => Lwt.return(None) - }; -}; - -let getVersion = () => { - let%lwt cwd = Lwt_unix.getcwd(); - let%lwt nodeVersion = versionString(Filename.concat(cwd, ".node-version")) - and nvmrc = versionString(Filename.concat(cwd, ".nvmrc")); - - switch (nodeVersion, nvmrc) { - | (None, None) => Lwt.fail(Version_Not_Provided) - | (Some(v1), Some(v2)) when Versions.format(v1) != Versions.format(v2) => - Lwt.fail(Conflicting_Dotfiles_Found(v1, v2)) - | (Some(version), Some(_)) - | (Some(version), None) - | (None, Some(version)) => Lwt.return(version) - }; -}; diff --git a/library/Fnm__Package.re b/library/Fnm__Package.re deleted file mode 100644 index a9f7861..0000000 --- a/library/Fnm__Package.re +++ /dev/null @@ -1 +0,0 @@ -let version = "1.21.0"; diff --git a/library/Fs.re b/library/Fs.re deleted file mode 100644 index cbd20e1..0000000 --- a/library/Fs.re +++ /dev/null @@ -1,94 +0,0 @@ -let readdir = dir => { - let items = ref([]); - let%lwt dir = Lwt_unix.opendir(dir); - let iterate = () => { - let%lwt _ = - while%lwt (true) { - let%lwt value = Lwt_unix.readdir(dir); - if (value.[0] != '.') { - items := [value, ...items^]; - }; - Lwt.return(); - }; - - Lwt.return([]); - }; - - let%lwt items = - try%lwt(iterate()) { - | End_of_file => Lwt.return(items^) - }; - - let%lwt _ = Lwt_unix.closedir(dir); - Lwt.return(items); -}; - -let writeFile = (path, contents) => { - let%lwt targetFile = Lwt_io.open_file(~mode=Lwt_io.Output, path); - - let%lwt () = Lwt_io.write(targetFile, contents); - let%lwt () = Lwt_io.close(targetFile); - - Lwt.return(); -}; - -let exists = path => { - try%lwt(Lwt_unix.file_exists(path)) { - | Unix.Unix_error(_, _, _) => Lwt.return(false) - }; -}; - -let readlink = path => - try%lwt(Lwt_unix.readlink(path) |> Lwt.map(x => Ok(x))) { - | err => Lwt.return_error(err) - }; - -[@deriving show] -type file_type = - | File(string) - | Dir(string); - -// Based on: https://github.com/fastpack/fastpack/blob/9f6aa7d5b83ffef03e73a15679200576ff9dbcb7/FastpackUtil/FS.re#L94 -let rec listDirRecursively = dir => { - switch%lwt (Lwt_unix.lstat(dir)) { - | {st_kind: Lwt_unix.S_DIR, _} => - Lwt_unix.files_of_directory(dir) - |> Lwt_stream.map_list_s( - fun - | "." - | ".." => Lwt.return([]) - | filename => Filename.concat(dir, filename) |> listDirRecursively, - ) - |> Lwt_stream.to_list - |> Lwt.map(xs => List.append(xs, [Dir(dir)])) - | _ => Lwt.return([File(dir)]) - | exception (Unix.Unix_error(Unix.ENOENT, _, _)) => Lwt.return([]) - }; -}; - -let rmdir = dir => { - let%lwt entities = listDirRecursively(dir); - - entities - |> Lwt_list.map_s( - fun - | Dir(dir) => Lwt_unix.rmdir(dir) - | File(file) => Lwt_unix.unlink(file), - ) - |> Lwt.map(_ => ()); -}; - -type path = - | Exists(string) - | Missing(string); - -let rec realpath = path => { - switch%lwt (readlink(path)) { - | Ok(path) => realpath(path) - | Error(_) => - switch%lwt (exists(path)) { - | true => Exists(path) |> Lwt.return - | false => Missing(path) |> Lwt.return - } - }; -}; diff --git a/library/Http.re b/library/Http.re deleted file mode 100644 index 55b7d48..0000000 --- a/library/Http.re +++ /dev/null @@ -1,42 +0,0 @@ -open Lwt.Infix; -open Cohttp; -open Cohttp_lwt_unix; - -type response = { - body: string, - status: int, -}; - -let body = response => response.body; -let status = response => response.status; - -exception Not_found(response); - -let throwOnKnownErrors = - fun - | {status: 404, _} as r => Lwt.fail(Not_found(r)) - | r => Lwt.return(r); - -let rec makeRequest = url => - Uri.of_string(url) - |> Cohttp_lwt_unix.Client.get - >>= ( - ((resp, body)) => { - let status = resp |> Response.status; - let code_of_status = status |> Code.code_of_status; - let location = resp |> Response.headers |> Header.get_location; - - switch (Code.is_redirection(code_of_status), location) { - | (true, Some(uri)) => makeRequest(Uri.to_string(uri)) - | _ => - let%lwt body = body |> Cohttp_lwt.Body.to_string; - throwOnKnownErrors({status: code_of_status, body}); - }; - } - ); - -let download = (url, ~into) => { - let%lwt _ = - makeRequest(url) >>= (({body, _}) => Fs.writeFile(into, body)); - Lwt.return(); -}; diff --git a/library/LocalVersionResolver.re b/library/LocalVersionResolver.re deleted file mode 100644 index b4022f6..0000000 --- a/library/LocalVersionResolver.re +++ /dev/null @@ -1,39 +0,0 @@ -exception Version_Not_Installed(string); - -/** Parse a local version, including lts and aliases */ -let getVersion = version => { - let%lwt parsed = Versions.parse(version); - let%lwt resultWithLts = - switch (parsed) { - | Ok(x) => Lwt.return_ok(x) - | Error("latest-*") => - switch%lwt (VersionListingLts.getLatest()) { - | Error(_) => Lwt.return_error(Version_Not_Installed(version)) - | Ok({VersionListingLts.lts, _}) => - Versions.Alias("latest-" ++ lts) |> Lwt.return_ok - } - | _ => Version_Not_Installed(version) |> Lwt.return_error - }; - resultWithLts |> Result.fold(Lwt.fail, Lwt.return); -}; - -/** - * Get matches for all versions that match a semver partial - */ -let getMatchingLocalVersions = version => { - open Versions.Local; - - let%lwt installedVersions = Versions.getInstalledVersions(); - let formattedVersionName = Versions.format(version); - - let matchingVersions = - installedVersions - |> List.filter(v => - Versions.isVersionFitsPrefix(formattedVersionName, v.name) - || v.name == formattedVersionName - || List.exists(alias => alias == formattedVersionName, v.aliases) - ) - |> List.sort((a, b) => - compare(a.name, b.name)); - - Lwt.return(matchingVersions); -}; diff --git a/library/LogLevel.re b/library/LogLevel.re deleted file mode 100644 index d2ce4f4..0000000 --- a/library/LogLevel.re +++ /dev/null @@ -1,23 +0,0 @@ -type t = - | Quiet - | Error - | Info - | Debug; - -let toString = logLevel => - switch (logLevel) { - | Quiet => "quiet" - | Error => "error" - | Info => "info" - | Debug => "debug" - }; - -let fromString = logLevelString => - switch (logLevelString) { - | "quiet" => Quiet - | "error" => Error - | "info" => Info - | "debug" - | "all" => Debug - | _ => failwith("Unsupported level: " ++ logLevelString) - }; diff --git a/library/Logger.re b/library/Logger.re deleted file mode 100644 index 30b846e..0000000 --- a/library/Logger.re +++ /dev/null @@ -1,28 +0,0 @@ -let configuredLogLevel = Config.FNM_LOGLEVEL.get(); - -let info = message => { - switch (configuredLogLevel) { - | LogLevel.Debug - | LogLevel.Info => Console.log(message) - | LogLevel.Error - | LogLevel.Quiet => () - }; -}; - -let debug = message => { - switch (configuredLogLevel) { - | LogLevel.Debug => Console.log(message) - | LogLevel.Info - | LogLevel.Error - | LogLevel.Quiet => () - }; -}; - -let error = message => { - switch (configuredLogLevel) { - | LogLevel.Debug - | LogLevel.Info - | LogLevel.Error => Console.error(message) - | LogLevel.Quiet => () - }; -}; diff --git a/library/Opt.re b/library/Opt.re deleted file mode 100644 index 6d68d52..0000000 --- a/library/Opt.re +++ /dev/null @@ -1,39 +0,0 @@ -let orThrow = (message, opt) => - switch (opt) { - | None => failwith(message) - | Some(x) => x - }; - -let map = (fn, opt) => - switch (opt) { - | None => None - | Some(x) => Some(fn(x)) - }; - -let bind = (fn, opt) => - switch (opt) { - | None => None - | Some(x) => fn(x) - }; - -let fold = (none, some, opt) => - switch (opt) { - | None => none() - | Some(x) => some(x) - }; - -let toResult = (error, opt) => - switch (opt) { - | None => Error(error) - | Some(x) => Ok(x) - }; - -let toLwt = (error, opt) => - switch (opt) { - | Some(x) => Lwt.return(x) - | None => Lwt.fail(error) - }; - -let some = x => Some(x); - -let (or) = (opt, b) => fold(() => b, x => x, opt); diff --git a/library/Path.re b/library/Path.re deleted file mode 100644 index 2218527..0000000 --- a/library/Path.re +++ /dev/null @@ -1,504 +0,0 @@ -/** - * Copyright 2004-present Facebook. All Rights Reserved. - * - * @emails oncall+ads_front_end_infra - */; - -[@warning "-27-39-32-34"]; - -let sep = "/"; -let homeChar = "~"; - -type absolute; -type relative; -type upDirs = int; /* int 0 implies ./ and 1 implies ../ etc */ - -/** - * We might eventually want to allow extending this with many - * reference points. - */ -type relFrom = - | Home - | Any; -type base('kind) = - /* Optional drive name */ - | Abs(option(string)): base(absolute) - | Rel(relFrom, upDirs): base(relative); -/** - * Internal representation of paths. The list of strings represents all - * subdirectories after the base (in reverse order - head of the list is the - * rightmost segment of the path). - */ -type t('kind) = (base('kind), list(string)); -type firstClass = - | Absolute(t(absolute)) - | Relative(t(relative)); -type opaqueBase = - | Base(base('exists)): opaqueBase; - -let drive = name => (Abs(Some(name)), []); -let root = (Abs(None), []); -let home = (Rel(Home, 0), []); -let dot = (Rel(Any, 0), []); - -let hasParentDir = ((Abs(_), lst): t(absolute)) => lst !== []; - -let rec revSegmentsAreInside = (~ofSegments, l) => - switch (ofSegments, l) { - | ([], [_, ..._]) => true - | ([], []) => true - | ([_, ..._], []) => false - | ([hd, ...tl], [hd2, ...tl2]) => - String.equal(hd, hd2) && revSegmentsAreInside(~ofSegments=tl, tl2) - }; - -let segmentsAreInside = (~ofSegments, l) => - revSegmentsAreInside(~ofSegments=List.rev(ofSegments), List.rev(l)); - -let isDescendent: type kind. (~ofPath: t(kind), t(kind)) => bool = - (~ofPath, p) => - switch (ofPath, p) { - | ((Abs(dr1), l1), (Abs(dr2), l2)) => - switch (dr1, dr2) { - | (None, None) => segmentsAreInside(~ofSegments=l1, l2) - | (Some(d1), Some(d2)) => - String.equal(d1, d2) && segmentsAreInside(~ofSegments=l1, l2) - | (Some(_), None) - | (None, Some(_)) => false - } - | ((Rel(Any, d1), l1), (Rel(Any, d2), l2)) => - d1 === d2 && segmentsAreInside(~ofSegments=l1, l2) - | ((Rel(Home, d1), l1), (Rel(Home, d2), l2)) => - d1 === d2 && segmentsAreInside(~ofSegments=l1, l2) - | ((Rel(Any, _), _), (Rel(Home, _), _)) => false - | ((Rel(Home, _), _), (Rel(Any, _), _)) => false - }; - -let toString: type kind. t(kind) => string = - path => - switch (path) { - | (Abs(l), lst) => - let lbl = - switch (l) { - | None => "" - | Some(txt) => txt - }; - lbl ++ "/" ++ (lst |> List.rev |> String.concat(sep)); - | (Rel(w, i), lst) => - let init = - switch (w) { - | Any => "." ++ sep - | Home => "~" ++ sep - }; - let rest = - lst - |> List.rev - |> List.append(Array.to_list(Array.init(i, _ => ".."))) - |> String.concat(sep); - init ++ rest; - }; - -/** - * Expose this under the name `toDebugString` and accept any kind of path. - * The name is to warn people about using this for relative paths. This may - * print paths like `"."` and `"~"`, which is not very meaningful. - */ -let toDebugString = toString; - -type token = - | SLASH - | DOT - | TILDE - | DOTDOT - | DRIVE(string) - | TXT(string); - -let makeToken = s => - switch (s) { - | "~" => TILDE - | "." => DOT - | ".." => DOTDOT - | s when String.length(s) >= 2 && s.[String.length(s) - 1] === ':' => - DRIVE(s) - | s => TXT(s) - }; -/* - * Splits on slashes, but being intelligent about escaped slashes. - */ -let lex = s => { - let s = String.trim(s); - let len = String.length(s); - let revTokens = {contents: []}; - /* j is what you are all caught up to */ - let j = {contents: (-1)}; - let prevEsc = {contents: false}; - for (i in 0 to len - 1) { - let ch = String.unsafe_get(s, i); - if (ch === '/' && !prevEsc.contents) { - if (j.contents !== i - 1) { - let tok = - makeToken(String.sub(s, j.contents + 1, i - j.contents - 1)); - revTokens.contents = [tok, ...revTokens.contents]; - }; - revTokens.contents = [SLASH, ...revTokens.contents]; - j.contents = i; - }; - prevEsc.contents = ch === '\\' && !prevEsc.contents; - }; - let rev = - j.contents === len - 1 - ? revTokens.contents - : [ - makeToken(String.sub(s, j.contents + 1, len - 1 - j.contents)), - ...revTokens.contents, - ]; - List.rev(rev); -}; - -let _parseFirstToken = token => - switch (token) { - | SLASH => (Base(Abs(None)), []) - | DOT => (Base(Rel(Any, 0)), []) - | TILDE => (Base(Rel(Home, 0)), []) - | DOTDOT => (Base(Rel(Any, 1)), []) - | DRIVE(l) => (Base(Abs(Some(l))), []) - | TXT(s) => (Base(Rel(Any, 0)), [s]) - }; - -let parseNextToken: type kind. (t(kind), token) => t(kind) = - (path, nextToken) => - switch (path, nextToken) { - | (path, SLASH) => path - | (path, DOT) => path - | ((base, subs), TILDE) => (base, [homeChar, ...subs]) - | ((base, subs), DRIVE(l)) => (base, [l, ...subs]) - | ((base, subs), TXT(s)) => (base, [s, ...subs]) - | ((base, [hd, ...tl]), DOTDOT) => (base, tl) - | ((Rel(Any, r), []), DOTDOT) => (Rel(Any, r + 1), []) - | ((Rel(Home, r), []), DOTDOT) => (Rel(Home, r + 1), []) - | ((Abs(_), []), DOTDOT) => path - }; - -let parseFirstTokenAbsolute = token => - switch (token) { - | SLASH => Some((Abs(None), [])) - | DRIVE(l) => Some((Abs(Some(l)), [])) - | TXT(_) - | DOT - | TILDE - | DOTDOT => None - }; - -let parseFirstTokenRelative = token => - switch (token) { - | DOT => Some((Rel(Any, 0), [])) - | TILDE => Some((Rel(Home, 0), [])) - | DOTDOT => Some((Rel(Any, 1), [])) - | TXT(s) => Some((Rel(Any, 0), [s])) - | SLASH => None - | DRIVE(l) => None - }; - -let absolute = s => - switch (lex(s)) { - /* Cannot pass empty string for absolute path */ - | [] => None - | [hd, ...tl] => - switch (parseFirstTokenAbsolute(hd)) { - | None => None - | Some(initAbsPath) => - Some(List.fold_left(parseNextToken, initAbsPath, tl)) - } - }; - -let absoluteExn = s => - switch (lex(s)) { - /* Cannot pass empty string for absolute path */ - | [] => raise(Invalid_argument("Empty path is not a valid absolute path.")) - | [hd, ...tl] => - switch (parseFirstTokenAbsolute(hd)) { - | None => - raise( - Invalid_argument("First token in path " ++ s ++ " is not absolute."), - ) - | Some(initAbsPath) => List.fold_left(parseNextToken, initAbsPath, tl) - } - }; - -let relative = s => { - let (tok, tl) = - switch (lex(s)) { - | [] => (DOT, []) - | [hd, ...tl] => (hd, tl) - }; - switch (parseFirstTokenRelative(tok)) { - | None => None - | Some(initRelPath) => - Some(List.fold_left(parseNextToken, initRelPath, tl)) - }; -}; - -let relativeExn = s => - switch (lex(s)) { - /* Cannot pass empty string for absolute path */ - | [] => dot - | [hd, ...tl] => - switch (parseFirstTokenRelative(hd)) { - | None => - raise( - Invalid_argument("First token in path " ++ s ++ " not relative."), - ) - | Some(initRelPath) => List.fold_left(parseNextToken, initRelPath, tl) - } - }; - -/** - * Relates two positive integers to zero and eachother. - */ -type ord = - | /** 0 === i === j */ - Zeros - | /** 0 === i < j */ - ZeroPositive - | /** i > 0 === j */ - PositiveZero - | /** 0 < i && 0 < j */ - Positives; - -/** - * Using `ord` allows us to retain exhaustiveness pattern matching checks that - * would normally be lost when adding `when i < j` guards to matches. It's - * very likely inlined so there's no performance hit. Annotate as int so that - * it isn't inferred to be polymorphic. - */ -let ord = (i: int, j: int) => - i === 0 && j === 0 - ? Zeros : i === 0 ? ZeroPositive : j === 0 ? PositiveZero : Positives; - -let rec repeat = (soFar, i, s) => - i === 0 ? soFar : repeat(soFar ++ s, i - 1, s); - -/* - * relativize(a/rest1..., a/rest2...) == relativize(rest1..., rest2...) - * relativize(../rest1..., ../rest2...) == relativize(rest1..., res2...) - * relativize(a/rest1..., b/rest2...) == [...len(1)]/b/rest2 - * relativize(../a/rest1..., b/rest2...) == raise - * relativize(a/rest1..., ../b/rest2...) == [...len(1)]../b/rest2 - * - * "upDirs" is the number of ../ the path is assumed to have. The segments - * `s1`/`s2`, are in the path order from left to right, unlike `Path.t` which - * usually stores them in reverse order. Relativizing paths is one place where - * it's more convenient to have them in the left to right segment order. - */ -let rec relativizeDepth = ((upDirs1, s1), (upDirs2, s2)) => - switch (ord(upDirs1, upDirs2), s1, s2) { - | (Zeros, [hd1, ...tl1], [hd2, ...tl2]) => - if (String.compare(hd1, hd2) === 0) { - relativizeDepth((0, tl1), (0, tl2)); - } else { - (List.length(s1), s2); - } - | (Zeros, [], []) => (0, []) - | (Zeros, [], [hd2, ...tl2] as s2) => (upDirs2, s2) - | (Zeros, [hd1, ...tl1] as s1, []) => (List.length(s1), []) - | (Positives, _, _) => - relativizeDepth((upDirs1 - 1, s1), (upDirs2 - 1, s2)) - | (ZeroPositive, _, _) => (List.length(s1) + upDirs2, s2) - | (PositiveZero, _, _) => - raise( - Invalid_argument( - "Cannot relativize paths source='" - ++ repeat("", upDirs1, "../") - ++ String.concat(sep, s1) - ++ "' dest='" - ++ repeat("", upDirs2, "../") - ++ String.concat(sep, s2), - ), - ) - }; - -let raiseDriveMismatch = (p1, p2) => - raise( - Invalid_argument( - "Cannot relativize paths with different drives or relative roots " - ++ toString(p1) - ++ " and " - ++ toString(p2), - ), - ); - -let relativizeExn: type k. (~source: t(k), ~dest: t(k)) => t(relative) = - (~source, ~dest) => { - let (depth, segs) = - switch (source, dest) { - | ((Abs(d1), s1), (Abs(d2), s2)) => - switch (d1, d2) { - | (None, None) => - relativizeDepth((0, List.rev(s1)), (0, List.rev(s2))) - | (Some(_), None) => raiseDriveMismatch(source, dest) - | (None, Some(_)) => raiseDriveMismatch(source, dest) - | (Some(d1), Some(d2)) => - String.compare(d1, d2) !== 0 - ? raiseDriveMismatch(source, dest) - : relativizeDepth((0, List.rev(s1)), (0, List.rev(s2))) - } - | ((Rel(w1, r1), s1), (Rel(w2, r2), s2)) => - w1 === w2 - ? relativizeDepth((r1, List.rev(s1)), (r2, List.rev(s2))) - : raiseDriveMismatch(source, dest) - }; - (Rel(Any, depth), List.rev(segs)); - }; - -let relativize: - type k. (~source: t(k), ~dest: t(k)) => result(t(relative), exn) = - (~source, ~dest) => - try(Ok(relativizeExn(~source, ~dest))) { - | Invalid_argument(_) as e => Error(e) - }; - -let rec segEq = (l1, l2) => - switch (l1, l2) { - | ([], []) => true - | ([], [_, ..._]) => false - | ([_, ..._], []) => false - | ([hd1, ...tl1], [hd2, ...tl2]) => - String.compare(hd1, hd2) === 0 && segEq(tl1, tl2) - }; - -let eq: type k1 k2. (t(k1), t(k2)) => bool = - (p1, p2) => - switch (p1, p2) { - | ((Abs(_), s1), (Rel(_), s2)) => false - | ((Rel(_), s1), (Abs(_), s2)) => false - | ((Abs(d1), s1), (Abs(d2), s2)) => - switch (d1, d2) { - | (Some(_), None) - | (None, Some(_)) => false - | (None, None) => segEq(s1, s2) - | (Some(d1), Some(d2)) => - String.compare(d1, d2) === 0 && segEq(s1, s2) - } - | ((Rel(w1, r1), s1), (Rel(w2, r2), s2)) => - w1 === w2 && r1 === r2 && segEq(s1, s2) - }; - -let absoluteEq = eq; - -let relativeEq = eq; - -let testForPath = s => - switch (absolute(s)) { - | Some(abs) => Some(Absolute(abs)) - | None => - switch (relative(s)) { - | Some(r) => Some(Relative(r)) - | None => None - } - }; - -let firstClass: type k. t(k) => firstClass = - p => - switch (p) { - | (Abs(d), s) => Absolute((Abs(d), s)) - | (Rel(w, r), s) => Relative((Rel(w, r), s)) - }; - -let testForPathExn = s => - switch (testForPath(s)) { - | Some(res) => res - | None => raise(Invalid_argument("Path neither absolute nor relative.")) - }; - -let continue = (s, path) => List.fold_left(parseNextToken, path, lex(s)); - -let rec join: type k1 k2. (t(k1), t(k2)) => t(k1) = - (p1, p2) => - switch (p1, p2) { - | ((Rel(w, r1), []), (Rel(Any, r2), s2)) => (Rel(w, r1 + r2), s2) - | ((Rel(w, r1), [s1hd, ...s1tl] as s1), (Rel(Any, r2), s2)) => - r2 > 0 - ? join((Rel(w, r1), s1tl), (Rel(Any, r2 - 1), s2)) - : (Rel(w, r1), List.append(s2, s1)) - | ((b1, s1), (Rel(Home, r2), s2)) => - join((b1, [homeChar, ...List.append(s2, s1)]), (Rel(Any, r2), s2)) - | ((b1, s1), (Abs(Some(ll)), s2)) => ( - b1, - [ll, ...List.append(s2, s1)], - ) - | ((b1, s1), (Abs(None), s2)) => (b1, List.append(s2, s1)) - | ((Abs(_) as d, []), (Rel(Any, r2), s2)) => (d, s2) - | ((Abs(_) as d, [s1hd, ...s1tl] as s1), (Rel(Any, r2), s2)) => - r2 > 0 - ? join((d, s1tl), (Rel(Any, r2 - 1), s2)) - : (d, List.append(s2, s1)) - }; - -let dirName: type k1. t(k1) => t(k1) = - p1 => - switch (p1) { - | (Rel(w, r1), []) => (Rel(w, r1 + 1), []) - | (Rel(w, r1), [s1hd, ...s1tl]) => (Rel(w, r1), s1tl) - | (Abs(_) as d, []) => (d, []) - | (Abs(_) as d, [s1hd, ...s1tl]) => (d, s1tl) - }; - -let baseName: type k1. t(k1) => option(string) = - p1 => - switch (p1) { - | (Rel(w, r1), []) => None - | (Rel(w, r1), [s1hd, ...s1tl]) => Some(s1hd) - | (Abs(_), []) => None - | (Abs(_), [s1hd, ...s1tl]) => Some(s1hd) - }; - -let sub: type k1. (string, t(k1)) => t(k1) = - (name, path) => continue(name, path); - -/** - * Append functions always follow their "natural" left/right ordering, - * regardless of t-first/last. - * - * The following pairs are equivalent but note that `append` is always safe. - * - * Path.append(Path.root, "foo"); - * Option.getUnsafe(Path.absolute("/foo")); - * - * Path.append(Path.root, "foo/bar"); - * Option.getUnsafe(Path.absolute("/foo/bar")); - * - * Path.append(Path.drive("C"), "foo/bar"); - * Option.getUnsafe(Path.absolute("C:/foo/bar")); - * - * Path.append(Path.dot, "foo"); - * Option.getUnsafe(Path.relative("./foo")); - */ -let append: type k1. (t(k1), string) => t(k1) = - (path, name) => continue(name, path); - -module At = { - let (/) = append; - /** - * Applies `dirName` to the first argument, then passes the result to - * `append` with the second. - * - * let result = root / "foo" / "bar" /../ "baz"; - * - * Would result in - * - * "/foo/baz" - */ - let (/../) = (dir, s) => append(dirName(dir), s); - let (/../../) = (dir, s) => append(dirName(dirName(dir)), s); - let (/../../../) = (dir, s) => - append(dirName(dirName(dirName(dir))), s); - let (/../../../../) = (dir, s) => - append(dirName(dirName(dirName(dirName(dir)))), s); - let (/../../../../../) = (dir, s) => - append(dirName(dirName(dirName(dirName(dirName(dir))))), s); - let (/../../../../../../) = (dir, s) => - append( - dirName(dirName(dirName(dirName(dirName(dirName(dir)))))), - s, - ); -}; diff --git a/library/Path.rei b/library/Path.rei deleted file mode 100644 index 07a859c..0000000 --- a/library/Path.rei +++ /dev/null @@ -1,276 +0,0 @@ -/** - -`Path` is a library for creating and operating on file paths consistently on -all platforms. - -`Path` works exactly the same on Windows, Linux, and OSX, instead of adjusting -behavior based on your current OS - -The `Path` API uses the following conventions: - -- Accepts/returns only `t(absolute))` for values that must be absolute paths. -- Accepts/returns only `t(relative))` for values that must be absolute paths. -- Accepts `t('any)` for values that may be either absolute or relative paths. -- Returns `firstClass = Absolute(t(absolute)) | Relative(t(relative)` for - return values that could be either. Consumers must pattern match on it. -- Wraps return values in `Some(..)` / `None` when it is possible that no - value may be computed even when the caller supplies valid data. -- Wraps return values in `Ok(..)` / `Error(exn)` when it is possible that no - value may be computed due to an error occuring in either user input or system - failure. -- For every `functionName` that wraps return values in `Ok`/`Error`, an - alternative form `functionNameExn` is also supplied which does not wrap - the return value, and instead raises an exception. - -TODO: Consider the following universal convention instead: - - type specificUsageError = UserNameInvalid | LoggedOut; - type blame('usage) = | Caller('usage) | Implementation(exn); - // Returns Error only for system blame: - result(x, exn) - // Returns Error for caller/system blame - result(x, blame(usage)) - // Returns Error only for caller blame - result(x, usage) - // Returns Error for caller/system blame, but no value expected. - result(option(x), blame(usage)) - // Returns Error for system blame, but no value expected. - result(option(x), exn) -*/ - -type relative; -type absolute; -/** -A file system path, parameterized on the kind of file system path, -`Path.t(relative)` or `Path.t(absolute)`. -*/ -type t('kind); - -/** -Used to allow dynamically checking whether or not a path is absolute or -relative. Use seldomly. -*/ -type firstClass = - | Absolute(t(absolute)) - | Relative(t(relative)); - -let drive: string => t(absolute); -let root: t(absolute); -let home: t(relative); -let dot: t(relative); - -/** -Queries whether a path is absolute or relative. Use seldomly, and typically -only on end-user input. Once queried, use the wrapped `t(absolute)/t(relative)` -as the primary path passed around. -*/ -let testForPath: string => option(firstClass); - -/** -Same as `testForPath`, but raises `Invalid_argument` if no path could be -detected. -*/ -let testForPathExn: string => firstClass; - -/** -Creates a "first class" path could be _either_ a relative path or an absolute -one. - -This allows you to return values from functions that might be absolute or might -be relative. It also allows relative and absolute paths to coexist inside of a -list together. -For example, if you create a polymorphic function that accepts any kind of -path, and then you want to do something differently based on whether or not the -path is relative or absolute, you would first use `firstClass(path)` and then -pattern match on the result `Absolute(p) => .. | Relative(p) => ...`. -*/ -let firstClass: t('any) => firstClass; - -/** - Prints absolute `Path.t` as strings, always removes the final `/` separator. - */ -let toString: t(absolute) => string; - -/** - Prints any `Path.t` for debugging, always removes the final `/` separator - except in the case of the empty relative paths `./`, `~/`. - */ -let toDebugString: t('kind) => string; - -/** -Parses an absolute path into a `Path.t(absolute)` or returns `None` if the path -is not a absolute, yet still valid. Raises Invalid_argument if the path is -invalid. - */ -let absolute: string => option(t(absolute)); -/** - Parses a relative path into a `Path.t(relative)` or returns `None` if the path - is not a valid. - */ -let relative: string => option(t(relative)); - -/** - Same as `Path.absolute` but raises a Invalid_argument if argument is not a - valid absolute path. - */ -let absoluteExn: string => t(absolute); - -/** - Same as `Path.relative` but raises a Invalid_argument if argument is not a - valid relative path. - */ -let relativeExn: string => t(relative); - -/** -Creates a relative path from two paths, which is the relative path that is -required to arive at the `dest`, if starting from `source` directory. The -`source` and `dest` must both be `t(absolute)` or `t(relative)`, but the -returned path is always of type `t(relative)`. - -If `source` and `dest` are relative, it is assumed that the two relative paths -are relative to the same yet-to-be-specified absolute path. - -relativize(~source=/a, ~dest=/a) == ./ -relativize(~source=/a/b/c/d /a/b/qqq == ../c/d -relativize(~source=/a/b/c/d, ~dest=/f/f/zzz) == ../../../../f/f/zz -relativize(~source=/a/b/c/d, ~dest=/a/b/c/d/q) == ../q -relativize(~source=./x/y/z, ~dest=./a/b/c) == ../../a/b/c -relativize(~source=./x/y/z, ~dest=../a/b/c) == ../../../a/b/c - -Unsupported: -`relativize` only accepts `source` and `dest` of the same kind of path because -the following are meaningless: - -relativize(~source=/x/y/z, ~dest=./a/b/c) == ??? -relativize(~source=./x/y/z, ~dest=/a/b/c) == ??? - -Exceptions: -If it is impossible to create a relative path from `soure` to `dest` an -exception is raised. -If `source`/`dest` are absolute paths, the drive must match or an exception is -thrown. If `source`/`dest` are relative paths, they both must be relative to -`"~"` vs. `"."`. If both are relative, but the source has more `..` than the -dest, then it is also impossible to create a relative path and an exception is -raised. - -relativize(~source=./foo/bar, ~dest=~/foo/bar) == raise(Invalid_argument) -relativize(~source=~/foo/bar, ~dest=./foo/) == raise(Invalid_argument) -relativize(~source=C:/foo/bar, ~dest=/foo/bar) == raise(Invalid_argument) -relativize(~source=C:/foo/bar, ~dest=F:/foo/bar) == raise(Invalid_argument) -relativize(~source=/foo/bar, ~dest=C:/foo/) == raise(Invalid_argument) -relativize(~source=../x/y/z, ~dest=./a/b/c) == raise(Invalid_argument) -relativize(~source=../x/y/z, ~dest=../foo/../a/b/c) == raise(Invalid_argument) -*/ -let relativizeExn: (~source: t('kind), ~dest: t('kind)) => t(relative); -/** -Same as `relativizeExn` but returns `result(Path.t(Path.absolute), exn)` -instead of throwing an exception. -*/ -let relativize: - (~source: t('kind), ~dest: t('kind)) => result(t(relative), exn); - -/** -Accepts any `Path.t` and returns a `Path.t` of the same kind. Relative path -inputs return relative path outputs, and absolute path inputs return absolute -path outputs. -*/ -let dirName: t('kind) => t('kind); - -/** -Accepts any `Path.t` and returns the final segment in its path string, or -`None` if there are no segments in its path string. - - Path.baseName(Path.At(Path.dot /../ "")) - None - - Path.baseName(Path.At(Path.dot /../ "foo")) - Some("foo") - - Path.baseName(Path.At(Path.dot /../ "foo" /../ "")) - None - - Path.baseName(Path.At(Path.dot /../ "foo" / "bar" /../ "")) - Some("foo") -*/ -let baseName: t('kind) => option(string); - -/** -Appends one segment to a path. Preserves the relative/absoluteness of the first -arguments. -*/ -let append: (t('kind), string) => t('kind); - -/** -Appends one path to another. Preserves the relative/absoluteness of the first -arguments. -*/ -let join: (t('kind1), t('kind2)) => t('kind1); - -let eq: (t('kind1), t('kind2)) => bool; - -/** -Tests for path equality of two absolute paths. -*/ -let absoluteEq: (t(absolute), t(absolute)) => bool; - -/** -Tests for path equality of two absolute paths. -*/ -let relativeEq: (t(relative), t(relative)) => bool; - -/** -Tests whether or not an absolute path has a parent path. Absolute paths such as -"C:/" and "/" have no parent dir. -*/ -let hasParentDir: t(absolute) => bool; - -/** -Returns `true` if a path exists inside another path `~ofPath` or is equal to -`~ofPath`. -*/ -let isDescendent: (~ofPath: t('kind), t('kind)) => bool; - -/** -Syntactic forms for utilities provided above. These are included in a separate -module so that it can be opened safely without causing collisions with other -identifiers in scope such as "root"/"home". - -Use like this: - - Path.At(Path.root / "foo" / "bar"); - Path.At(Path.dot /../ "bar"); -*/ -module At: { - /** - Performs `append` with infix syntax. - */ - let (/): (t('kind), string) => t('kind); - /** - `dir /../ s` is equivalent to `append(dirName(dir), s)` - */ - let (/../): (t('kind), string) => t('kind); - /** - `dir /../../ s` is equivalent to `append(dirName(dirName(dir)), s)` - */ - let (/../../): (t('kind), string) => t('kind); - /** - `dir /../../../ s` is equivalent to - `append(dirName(dirName(dirName(dir))), s)` - */ - let (/../../../): (t('kind), string) => t('kind); - /** - `dir /../../../../ s` is equivalent to - `append(dirName(dirName(dirName(dirName(dir)))), s)` - */ - let (/../../../../): (t('kind), string) => t('kind); - /** - `dir /../../../../../ s` is equivalent to - `append(dirName(dirName(dirName(dirName(dirName(dir))))), s)` - */ - let (/../../../../../): (t('kind), string) => t('kind); - /** - `dir /../../../../../../ s` is equivalent to - `append(dirName(dirName(dirName(dirName(dirName(dirName(dir)))))), s)` - */ - let (/../../../../../../): (t('kind), string) => t('kind); -}; \ No newline at end of file diff --git a/library/Result.re b/library/Result.re deleted file mode 100644 index fb20225..0000000 --- a/library/Result.re +++ /dev/null @@ -1,61 +0,0 @@ -let return = x => Ok(x); - -let both = (a, b) => - switch (a, b) { - | (Error(_) as e, _) - | (_, Error(_) as e) => e - | (Ok(ax), Ok(bx)) => Ok((ax, bx)) - }; - -let mapError = (fn, res) => - switch (res) { - | Error(x) => Error(fn(x)) - | Ok(_) as x => x - }; - -let map = (fn, res) => - switch (res) { - | Ok(x) => Ok(fn(x)) - | Error(_) as e => e - }; - -let bind = (fn, res) => - switch (res) { - | Ok(x) => fn(x) - | Error(_) as e => e - }; - -let bind_err = (fn, res) => - switch (res) { - | Ok(_) as o => o - | Error(x) => fn(x) - }; - -let bind_err_lwt = (fn, res) => - switch (res) { - | Ok(o) => Lwt.return_ok(o) - | Error(x) => fn(x) - }; - -let fold = (error, ok, res) => - switch (res) { - | Ok(x) => ok(x) - | Error(x) => error(x) - }; - -module Let_syntax = { - let map = (x, ~f) => map(f, x); - let bind = (x, ~f) => bind(f, x); -}; - -let toLwt = res => - switch (res) { - | Error(x) => Lwt.fail_with(x) - | Ok(x) => Lwt.return(x) - }; - -let toLwtErr = res => - switch (res) { - | Error(x) => Lwt.fail(x) - | Ok(x) => Lwt.return(x) - }; diff --git a/library/Semver.re b/library/Semver.re deleted file mode 100644 index c159d31..0000000 --- a/library/Semver.re +++ /dev/null @@ -1,23 +0,0 @@ -[@deriving (eq, ord, make)] -type t = { - major: int, - minor: int, - patch: int, -}; - -let fromString = str => - switch ( - String.split_on_char('.', str) - |> List.map(int_of_string_opt) - |> Base.Option.all - ) { - | Some([major, minor, patch]) => Some({major, minor, patch}) - | _ => None - }; - -let toString = ({major, minor, patch}) => - Printf.sprintf("%d.%d.%d", major, minor, patch); - -let major = ({major, _}) => major; -let minor = ({minor, _}) => minor; -let patch = ({patch, _}) => patch; diff --git a/library/Semver.rei b/library/Semver.rei deleted file mode 100644 index 31a5858..0000000 --- a/library/Semver.rei +++ /dev/null @@ -1,11 +0,0 @@ -[@deriving (eq, ord)] -type t; - -let make: (~major: int, ~minor: int, ~patch: int) => t; - -let fromString: string => option(t); -let toString: t => string; - -let major: t => int; -let minor: t => int; -let patch: t => int; diff --git a/library/System.re b/library/System.re deleted file mode 100644 index b65d360..0000000 --- a/library/System.re +++ /dev/null @@ -1,109 +0,0 @@ -let unix_exec = - (~args=[||], ~env=?, ~stderr: Lwt_process.redirection=`Keep, command) => { - let realArgs = Array.append([|command|], args); - Lwt_process.pread_lines(~stderr, ~env?, ("", realArgs)) - |> Lwt_stream.to_list; -}; - -let mkdirp = destination => - unix_exec("mkdir", ~stderr=`Dev_null, ~args=[|"-p", destination|]); - -module Shell = { - type t = - | Bash - | Zsh - | Fish; - - let infer = () => { - let processInfo = pid => { - switch%lwt (unix_exec("ps", ~args=[|"-o", "ppid,comm", pid|])) { - | [] => Lwt.return_none - | [_headers, line, ..._otherLines] => - let psResult = String.split_on_char(' ', line |> String.trim); - let parentPid = List.nth(psResult, 0); - let executable = List.nth(psResult, 1) |> Filename.basename; - Lwt.return_some((parentPid, executable)); - | [_, ..._] => Lwt.return_none - }; - }; - - let rec getShell = (~level=0, pid) => { - switch%lwt (processInfo(pid)) { - | Some((_, "sh")) - | Some((_, "-sh")) - | Some((_, "-bash")) - | Some((_, "bash")) => Lwt.return_some(Bash) - | Some((_, "-zsh")) - | Some((_, "zsh")) => Lwt.return_some(Zsh) - | Some((_, "fish")) - | Some((_, "-fish")) => Lwt.return_some(Fish) - | Some((ppid, _)) when level < 10 => getShell(~level=level + 1, ppid) - | Some(_) - | None => Lwt.return_none - }; - }; - - getShell(Unix.getpid() |> string_of_int); - }; -}; - -module NodeArch = { - type t = - | X32 - | X64 - | Other; - - let rec last = xs => - switch (xs) { - | [x] => Some(x) - | [_, ...xs] => last(xs) - | [] => None - }; - - let findArches = unameResult => { - let words = unameResult |> List.hd |> String.split_on_char(' '); - List.exists(word => word == "x86_64", words) ? X64 : X32; - }; - - /* Get node-compliant architecture (x64, x86) */ - let get = () => - switch (Sys.os_type) { - | "Unix" => - let%lwt result = unix_exec("uname", ~args=[|"-a"|]); - try(result |> findArches |> Lwt.return) { - | _ => Lwt.fail_with("Error getting unix information") - }; - | _ => Lwt.return(Other) - }; - - let toString = - fun - | X64 => "x64" - | X32 => "x32" - | Other => "other"; -}; - -module NodeOS = { - type t = - | Darwin - | Linux - | Other(string); - - let get = () => - switch (Sys.os_type) { - | "Unix" => - let%lwt result = unix_exec("uname", ~args=[|"-s"|]); - switch (result |> List.hd) { - | "Darwin" => Lwt.return(Darwin) - | _ => Lwt.return(Linux) - | exception _ => Lwt.fail_with("Error getting unix information") - }; - | other => Other(other) |> Lwt.return - }; - - let toString = - fun - | Darwin => "darwin" - | Linux => "linux" - | Other(_) => "other"; -}; diff --git a/library/VersionListing.re b/library/VersionListing.re deleted file mode 100644 index 2d4920a..0000000 --- a/library/VersionListing.re +++ /dev/null @@ -1,34 +0,0 @@ -type item = { - version: string, - date: string, - files: list(string), - lts: option(string), -}; - -let item_of_yojson = (json: Yojson.Safe.t) => { - open Yojson.Safe.Util; - let version = json |> member("version") |> to_string; - let files = json |> member("files") |> to_list |> List.map(to_string); - let date = json |> member("date") |> to_string; - let lts = - Base.Option.try_with(() => - json |> member("lts") |> to_string |> String.lowercase_ascii - ); - Ok({version, date, files, lts}); -}; - -[@deriving of_yojson({strict: false})] -type t = list(item); - -let parseVersionListing = body => { - Base.Result.try_with(() => Yojson.Safe.from_string(body)) - |> Base.Result.map_error(~f=Printexc.to_string) - |> Base.Result.bind(~f=x => of_yojson(x)); -}; - -let fromHttp = () => { - let url = - Config.FNM_NODE_DIST_MIRROR.get() |> Printf.sprintf("%s/index.json"); - let%lwt {Http.body, _} = Http.makeRequest(url); - parseVersionListing(body) |> Lwt.return; -}; diff --git a/library/VersionListingLts.re b/library/VersionListingLts.re deleted file mode 100644 index 403745c..0000000 --- a/library/VersionListingLts.re +++ /dev/null @@ -1,29 +0,0 @@ -type item = { - version: string, - lts: string, -}; - -let item_to_lts = (item: VersionListing.item) => { - item.lts |> Base.Option.map(~f=lts => {lts, version: item.version}); -}; - -type get_latest_lts_errors = - | Cant_parse_remote_version_listing(string) - | Cant_find_latest_lts; - -exception Problem_with_finding_latest_lts(get_latest_lts_errors); - -let getLatest = () => { - let%lwt versions = VersionListing.fromHttp(); - versions - |> Base.Result.map_error(~f=err => Cant_parse_remote_version_listing(err)) - |> Base.Result.bind(~f=parsed => - parsed - |> Base.List.filter_map(~f=item_to_lts) - |> Base.List.max_elt(~compare=(a, b) => - Versions.compare(a.version, b.version) - ) - |> Base.Result.of_option(~error=Cant_find_latest_lts) - ) - |> Lwt.return; -}; diff --git a/library/Versions.re b/library/Versions.re deleted file mode 100644 index 912304a..0000000 --- a/library/Versions.re +++ /dev/null @@ -1,372 +0,0 @@ -module VersionSet = Set.Make(String); - -let lwtIgnore = lwt => Lwt.catch(() => lwt, _ => Lwt.return()); - -let flip = (fn, a, b) => fn(b, a); - -let skip = (~amount, str) => - Str.last_chars(str, String.length(str) - amount); - -let parseSemver = version => version |> skip(~amount=1) |> Semver.fromString; - -let compare = (v1, v2) => - switch (parseSemver(v1), parseSemver(v2)) { - | (Some(v1), Some(v2)) => Semver.compare(v1, v2) - | (None, _) - | (_, None) => - Base.String.compare(v1, v2) - }; - -let isVersionFitsPrefix = (prefix, version) => { - let length = String.length(prefix); - String.length(version) >= length - + 1 - && Str.first_chars(version, length + 1) == prefix - ++ "."; -}; - -module Local = { - type t = { - name: string, - fullPath: string, - aliases: list(string), - }; - - let systemVersion: t = { - name: "system", - fullPath: "/dev/null/installation", - aliases: [], - }; - - let toDirectory = name => - Filename.concat( - Filename.concat(Directories.nodeVersions, name), - "installation", - ); - - let remove = version => Fs.rmdir(version.fullPath); - - let getLatestInstalledNameByPrefix = prefix => - Lwt.Infix.( - { - let%lwt versions = - Lwt.catch( - () => - Fs.readdir(Directories.nodeVersions) - >|= List.filter(isVersionFitsPrefix(prefix)) - >|= List.sort(flip(compare)), - _ => Lwt.return_nil, - ); - switch (versions) { - | [version, ..._xs] => Lwt.return_some(version) - | [] => Lwt.return_none - }; - } - ); -}; - -exception Version_not_found(string); - -module Aliases = { - module VersionAliasMap = Map.Make(String); - - type t = { - name: string, - versionName: string, - fullPath: string, - }; - - let toDirectory = name => Filename.concat(Directories.aliases, name); - - let getAll = () => { - let%lwt aliases = - try%lwt(Fs.readdir(Directories.aliases)) { - | _ => Lwt.return([]) - }; - aliases - |> Lwt_list.map_p(alias => { - let fullPath = Filename.concat(Directories.aliases, alias); - let%lwt realpath = - Filename.concat(Directories.aliases, alias) - |> Fs.realpath - |> Lwt.map( - fun - | Fs.Exists(x) => x - | Fs.Missing(x) => x, - ); - - Lwt.return({ - name: alias, - fullPath, - versionName: realpath |> Filename.dirname |> Filename.basename, - }); - }); - }; - - let byVersion = () => { - let%lwt aliases = getAll(); - aliases - |> List.fold_left( - (map, curr) => { - let value = - switch (VersionAliasMap.find_opt(curr.versionName, map)) { - | None => [curr.name] - | Some(arr) => [curr.name, ...arr] - }; - VersionAliasMap.add(curr.versionName, value, map); - }, - VersionAliasMap.empty, - ) - |> Lwt.return; - }; - - let set = (~alias, ~versionPath) => { - let aliasPath = alias |> toDirectory; - let%lwt _ = System.mkdirp(Directories.aliases); - let%lwt _ = Lwt_unix.unlink(aliasPath) |> lwtIgnore; - let%lwt _ = Lwt_unix.symlink(versionPath, aliasPath); - Lwt.return(); - }; -}; - -module Remote = { - type t = { - name: string, - baseURL: string, - installed: bool, - }; - - let getInstalledVersionSet = () => - Lwt.( - catch(() => Fs.readdir(Directories.nodeVersions), _ => return([])) - >|= List.fold_left( - (acc, curr) => VersionSet.add(curr, acc), - VersionSet.empty, - ) - ); - - let getRelativeLinksFromHTML = html => - Soup.parse(html) - |> Soup.select("pre a") - |> Soup.to_list - |> List.map(Soup.attribute("href")) - |> Base.List.filter_map(~f=x => x) - |> List.map(x => { - let parts = String.split_on_char('/', x) |> List.rev; - switch (parts) { - | ["", x, ..._xs] => x ++ "/" - | [x, ..._xs] => x - | [] => "" - }; - }); - - let downloadFileSuffix = ".tar.xz"; - - let getVersionFromFilename = filename => { - let strings = filename |> String.split_on_char('-'); - List.nth(strings, 1); - }; -}; - -let ltsVersion = version => - if (Base.String.is_prefix(version, ~prefix="lts/")) { - switch (Str.last_chars(version, String.length(version) - 4)) { - | exception _ => None - | x => Some(x) - }; - } else { - None; - }; - -let format = version => { - let version = - switch (Str.first_chars(version, 1) |> Int32.of_string) { - | _ => "v" ++ version - | exception _ => version - }; - - let version = - switch (ltsVersion(version)) { - | Some(lts) => "latest-" ++ lts - | None => version - }; - - version; -}; - -let endsWith = (~suffix, str) => { - let suffixLength = String.length(suffix); - - String.length(str) > suffixLength - && Str.last_chars(str, suffixLength) == suffix; -}; - -exception No_Download_For_System(System.NodeOS.t, System.NodeArch.t); - -let getCurrentVersion = () => - switch%lwt (Fs.realpath(Directories.currentVersion)) { - | Missing(x) when x == Directories.currentVersion => Lwt.return_none - | Missing(_) => Lwt.return_some(Local.systemVersion) - | Exists(installationPath) => - let fullPath = Filename.dirname(installationPath); - Lwt.return_some( - Local.{ - fullPath, - name: - fullPath - |> Path.absolute - |> Base.Option.bind(~f=Path.baseName) - |> Base.Option.value(~default=""), - aliases: [], - }, - ); - }; - -let getInstalledVersions = () => { - let%lwt versions = - Fs.readdir(Directories.nodeVersions) |> Lwt.map(List.sort(compare)) - and aliases = Aliases.byVersion(); - - versions - |> List.map(name => - Local.{ - name, - fullPath: Filename.concat(Directories.nodeVersions, name), - aliases: Opt.(Aliases.VersionAliasMap.find_opt(name, aliases) or []), - } - ) - |> List.append([Local.systemVersion]) - |> Lwt.return; -}; - -let getRemoteVersions = () => { - let%lwt bodyString = - Config.FNM_NODE_DIST_MIRROR.get() - |> Http.makeRequest - |> Lwt.map(Http.body); - - let versions = bodyString |> Remote.getRelativeLinksFromHTML; - let%lwt installedVersions = Remote.getInstalledVersionSet(); - - versions - |> List.filter(x => - Str.last_chars(x, 1) == "/" && Str.first_chars(x, 1) != "." - ) - |> List.map(x => Str.first_chars(x, String.length(x) - 1)) - |> List.sort(compare) - |> List.map(name => - Remote.{ - name, - installed: VersionSet.find_opt(name, installedVersions) != None, - baseURL: - Printf.sprintf("%s%s/", Config.FNM_NODE_DIST_MIRROR.get(), name), - } - ) - |> Lwt.return; -}; - -let getRemoteLatestVersionByPrefix = prefix => - Remote.( - { - let%lwt remoteVersions = getRemoteVersions(); - - let compatibleVersions = - remoteVersions - |> List.map(x => x.name) - |> List.filter(isVersionFitsPrefix(prefix)) - |> List.sort(flip(compare)); - - switch (compatibleVersions) { - | [version, ..._vs] => Lwt.return_some(version) - | [] => Lwt.return_none - }; - } - ); - -let getExactFileToDownload = (~version as versionName, ~os, ~arch) => { - let versionName = - switch (Str.first_chars(versionName, 1) |> Int32.of_string) { - | _ => "v" ++ versionName - | exception _ => versionName - }; - - let url = - Printf.sprintf("%s%s/", Config.FNM_NODE_DIST_MIRROR.get(), versionName); - - let%lwt html = - try%lwt(Http.makeRequest(url) |> Lwt.map(Http.body)) { - | Http.Not_found(_) => Lwt.fail(Version_not_found(versionName)) - }; - - let filenames = - html - |> Remote.getRelativeLinksFromHTML - |> List.filter( - endsWith( - ~suffix= - System.NodeOS.toString(os) - ++ "-" - ++ System.NodeArch.toString(arch) - ++ Remote.downloadFileSuffix, - ), - ); - - switch (filenames |> List.hd) { - | filename => - let nodeVersion = List.nth(String.split_on_char('-', filename), 1); - Lwt.return((nodeVersion, url ++ filename)); - | exception _ => Lwt.fail(No_Download_For_System(os, arch)) - }; -}; - -let getFileToDownload = (~version, ~os, ~arch) => - try%lwt(getExactFileToDownload(~version, ~os, ~arch)) { - | Version_not_found(_) as e => - switch%lwt (getRemoteLatestVersionByPrefix(version)) { - | None => Lwt.fail(e) - | Some(exactVersion) => - getExactFileToDownload(~version=exactVersion, ~os, ~arch) - } - }; - -type t = - | System - | Alias(string) - | Local(string); - -let parse = version => { - let formattedVersion = format(version); - - if (formattedVersion == Local.systemVersion.name) { - Lwt.return_ok(System); - } else { - let%lwt aliasExists = Aliases.toDirectory(version) |> Fs.exists - and aliasExistsOnFormatted = - Aliases.toDirectory(formattedVersion) |> Fs.exists - and versionExists = Local.toDirectory(formattedVersion) |> Fs.exists - and versionByPrefixPath = - Local.getLatestInstalledNameByPrefix(formattedVersion); - - switch ( - versionExists, - aliasExists, - aliasExistsOnFormatted, - versionByPrefixPath, - ) { - | (true, _, _, _) => Local(formattedVersion) |> Lwt.return_ok - | (_, true, _, _) => Alias(version) |> Lwt.return_ok - | (_, _, true, _) => Alias(formattedVersion) |> Lwt.return_ok - | (_, false, false, Some(version)) => Local(version) |> Lwt.return_ok - | (false, false, false, None) => Lwt.return_error(formattedVersion) - }; - }; -}; - -let isInstalled = versionName => { - let%lwt installedVersions = - try%lwt(getInstalledVersions()) { - | _ => Lwt.return([]) - }; - installedVersions - |> List.exists(x => Local.(x.name == versionName)) - |> Lwt.return; -}; diff --git a/library/dune b/library/dune deleted file mode 100644 index 893a5d3..0000000 --- a/library/dune +++ /dev/null @@ -1,12 +0,0 @@ - -; !!!! This dune file is generated from the package.json file by pesy. If you modify it by hand -; !!!! your changes will be undone! Instead, edit the package.json and then rerun 'esy pesy' at the project root. -; !!!! If you want to stop using pesy and manage this file by hand, change package.json's 'esy.build' command to: refmterr dune build -p fnm -(library - ; The namespace that other packages/libraries will access this library through - (name Fnm) - ; Other libraries list this name in their package.json 'require' field to use this library. - (public_name fnm.lib) - (libraries pastel.lib str base lwt tls lambdasoup cohttp cohttp-lwt cohttp-lwt-unix console.lib ppx_deriving_yojson.runtime ) - (preprocess ( pps lwt_ppx ppx_let ppx_deriving.show ppx_deriving.eq ppx_deriving.make ppx_deriving.ord ppx_deriving_yojson )) ; From package.json preprocess field -) \ No newline at end of file diff --git a/package.json b/package.json deleted file mode 100644 index 09ee838..0000000 --- a/package.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "name": "fnm", - "version": "1.21.0", - "description": "Fast and simple Node.js version manager, built in ReasonML", - "esy": { - "build": "pesy", - "release": { - "releasedBinaries": [ - "fnm.exe" - ] - } - }, - "buildDirs": { - "test": { - "require": [ - "fnm.lib", - "rely.lib" - ], - "main": "TestFnm", - "name": "TestFnm.exe", - "ocamloptFlags": [ - "-linkall", - "-g" - ] - }, - "library": { - "preprocess": [ - "pps", - "lwt_ppx", - "ppx_let", - "ppx_deriving.show", - "ppx_deriving.eq", - "ppx_deriving.make", - "ppx_deriving.ord", - "ppx_deriving_yojson" - ], - "require": [ - "pastel.lib", - "str", - "base", - "lwt", - "tls", - "lambdasoup", - "cohttp", - "cohttp-lwt", - "cohttp-lwt-unix", - "console.lib", - "ppx_deriving_yojson.runtime" - ], - "name": "fnm.lib", - "namespace": "Fnm" - }, - "executable": { - "preprocess": [ - "pps", - "lwt_ppx", - "ppx_let" - ], - "require": [ - "base", - "cmdliner", - "lwt", - "lambdasoup", - "console.lib", - "pastel.lib", - "fnm.lib" - ], - "flags": [ - "-ccopt", - "-lgmp" - ], - "main": "FnmApp", - "name": "fnm.exe" - } - }, - "scripts": { - "pesy": "bash -c 'env PESY_MODE=update pesy'", - "update-fnm-package": "node ./.ci/prepare-fnm-package.js", - "verify-fnm-package": "node ./.ci/prepare-fnm-package.js --fail-on-difference", - "bootstrap": ".ci/bootstrap", - "test": "esy x TestFnm.exe", - "fmt": "bash -c 'esy @fmt refmt --in-place ./*/*.re'", - "changelog": "bash -c 'esy lerna-changelog --from=v1.0.0 --next-version=${NEXT_VERSION-Unreleased} > CHANGELOG.md'", - "version:prepare": "node ./.ci/prepare-version.js" - }, - "license": "GPL-3.0", - "dependencies": { - "@esy-ocaml/reason": "*", - "@opam/base": "v0.13.1", - "@opam/cmdliner": "^1.0.3", - "@opam/cohttp": "^2.1.2", - "@opam/cohttp-lwt": "^2.0.0", - "@opam/cohttp-lwt-unix": "^2.0.0", - "@opam/dune": "^1.9.3", - "@opam/lambdasoup": "^0.6.3", - "@opam/lwt": "< 6.0.0", - "@opam/lwt_ppx": "< 3.0.0", - "@opam/ppx_deriving": "^4.2.1", - "@opam/ppx_deriving_yojson": "3.5.1", - "@opam/ppx_let": "v0.13.0", - "@opam/tls": "0.10.5", - "@opam/yojson": "1.7.0", - "@reason-native/console": "^0.1.0", - "@reason-native/pastel": "^0.2.0", - "@reason-native/rely": "^3.2.0", - "ocaml": "~4.8.0", - "pesy": "*", - "refmterr": "*" - }, - "devDependencies": { - "@opam/merlin": "*", - "prettier": "*", - "jest-diff": "24.0.0", - "lint-staged": "*", - "lerna-changelog": "*" - }, - "resolutions": { - "@opam/conf-gmp": "Schniz/esy-gmp#b48f9d1d0cf9df2d939371819635cbe72b0c281c" - }, - "changelog": { - "repo": "Schniz/fnm", - "labels": { - "PR: New Feature": "New Feature 🎉", - "PR: Bugfix": "Bugfix 🐛", - "PR: Internal": "Internal 🛠", - "PR: Documentation": "Documentation 📝" - } - }, - "lint-staged": { - "*.re": [ - "esy @fmt refmt --in-place", - "git add" - ], - "*.{js,md,json}": [ - "esy prettier --write", - "git add" - ], - "package.json": [ - "esy verify-fnm-package" - ] - } -} diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..f45d8f1 --- /dev/null +++ b/renovate.json @@ -0,0 +1,5 @@ +{ + "extends": [ + "config:base" + ] +} diff --git a/src/alias.rs b/src/alias.rs new file mode 100644 index 0000000..4233b03 --- /dev/null +++ b/src/alias.rs @@ -0,0 +1,73 @@ +use crate::config::FnmConfig; +use crate::fs::{remove_symlink_dir, symlink_dir}; +use crate::version::Version; +use std::convert::TryInto; +use std::path::PathBuf; + +pub fn create_alias( + config: &FnmConfig, + common_name: &str, + version: &Version, +) -> std::io::Result<()> { + let aliases_dir = config.aliases_dir(); + std::fs::create_dir_all(&aliases_dir)?; + + let version_dir = version + .installation_path(config) + .ok_or_else(|| std::io::Error::from(std::io::ErrorKind::NotFound))?; + let alias_dir = aliases_dir.join(common_name); + + if alias_dir.exists() { + remove_symlink_dir(&alias_dir)?; + } + + symlink_dir(&version_dir, &alias_dir)?; + + Ok(()) +} + +pub fn list_aliases(config: &FnmConfig) -> std::io::Result> { + let vec: Vec<_> = std::fs::read_dir(&config.aliases_dir())? + .filter_map(|item| item.ok()) + .filter_map(|x| TryInto::::try_into(x.path().as_path()).ok()) + .collect(); + Ok(vec) +} + +#[derive(Debug)] +pub struct StoredAlias { + alias_path: PathBuf, + destination_path: PathBuf, +} + +impl std::convert::TryInto for &std::path::Path { + type Error = std::io::Error; + + fn try_into(self) -> Result { + let destination_path = std::fs::canonicalize(&self)?; + Ok(StoredAlias { + alias_path: PathBuf::from(self), + destination_path, + }) + } +} + +impl StoredAlias { + pub fn s_ver(&self) -> &str { + self.destination_path + .parent() + .unwrap() + .file_name() + .expect("must have basename") + .to_str() + .unwrap() + } + + pub fn name(&self) -> &str { + self.alias_path + .file_name() + .expect("must have basename") + .to_str() + .unwrap() + } +} diff --git a/src/archive/extract.rs b/src/archive/extract.rs new file mode 100644 index 0000000..52016ea --- /dev/null +++ b/src/archive/extract.rs @@ -0,0 +1,43 @@ +use std::error::Error as StdError; +use std::path::Path; + +#[derive(Debug)] +pub enum Error { + IoError(std::io::Error), + ZipError(zip::result::ZipError), + HttpError(reqwest::Error), +} + +impl std::fmt::Display for Error { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::IoError(x) => x.fmt(f), + Self::ZipError(x) => x.fmt(f), + Self::HttpError(x) => x.fmt(f), + } + } +} + +impl StdError for Error {} + +impl From for Error { + fn from(err: std::io::Error) -> Self { + Self::IoError(err) + } +} + +impl From for Error { + fn from(err: zip::result::ZipError) -> Self { + Self::ZipError(err) + } +} + +impl From for Error { + fn from(err: reqwest::Error) -> Self { + Self::HttpError(err) + } +} + +pub trait Extract { + fn extract_into>(self, path: P) -> Result<(), Error>; +} diff --git a/src/archive/mod.rs b/src/archive/mod.rs new file mode 100644 index 0000000..e3cf33f --- /dev/null +++ b/src/archive/mod.rs @@ -0,0 +1,7 @@ +pub mod extract; +pub mod tar_xz; +pub mod zip; + +pub use self::extract::{Error, Extract}; +pub use self::tar_xz::TarXz; +pub use self::zip::Zip; diff --git a/src/archive/tar_xz.rs b/src/archive/tar_xz.rs new file mode 100644 index 0000000..6b581b0 --- /dev/null +++ b/src/archive/tar_xz.rs @@ -0,0 +1,23 @@ +use super::extract::{Error, Extract}; +use reqwest::blocking::Response; +use std::path::Path; + +pub struct TarXz { + response: Response, +} + +impl TarXz { + #[allow(dead_code)] + pub fn new(response: Response) -> Self { + Self { response } + } +} + +impl Extract for TarXz { + fn extract_into>(self, path: P) -> Result<(), Error> { + let xz_stream = xz2::read::XzDecoder::new(self.response); + let mut tar_archive = tar::Archive::new(xz_stream); + tar_archive.unpack(&path)?; + Ok(()) + } +} diff --git a/src/archive/zip.rs b/src/archive/zip.rs new file mode 100644 index 0000000..237ca11 --- /dev/null +++ b/src/archive/zip.rs @@ -0,0 +1,103 @@ +use super::extract::{Error, Extract}; +use log::debug; +use reqwest::blocking::Response; +use std::fs; +use std::io; +use std::path::Path; +use tempfile::tempfile; +use zip::read::ZipArchive; + +pub struct Zip { + response: Response, +} + +impl Zip { + #[allow(dead_code)] + pub fn new(response: Response) -> Self { + Self { response } + } +} + +impl Extract for Zip { + fn extract_into>(mut self, path: P) -> Result<(), Error> { + let path = path.as_ref(); + let mut tmp_zip_file = tempfile().expect("Can't get a temporary file"); + + debug!("Created a temporary zip file"); + self.response.copy_to(&mut tmp_zip_file)?; + debug!( + "Wrote zipfile successfuly. Now extracting into {}.", + path.display() + ); + + let mut archive = ZipArchive::new(&mut tmp_zip_file)?; + + for i in 0..archive.len() { + let mut file = archive.by_index(i)?; + let outpath = path.join(file.sanitized_name()); + + { + let comment = file.comment(); + if !comment.is_empty() { + debug!("File {} comment: {}", i, comment); + } + } + + if (&*file.name()).ends_with('/') { + debug!( + "File {} extracted to \"{}\"", + i, + outpath.as_path().display() + ); + fs::create_dir_all(&outpath)?; + } else { + debug!( + "Extracting file {} to \"{}\" ({} bytes)", + i, + outpath.as_path().display(), + file.size() + ); + if let Some(p) = outpath.parent() { + if !p.exists() { + fs::create_dir_all(&p)?; + } + } + let mut outfile = fs::File::create(&outpath)?; + io::copy(&mut file, &mut outfile)?; + } + + // Get and Set permissions + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + + if let Some(mode) = file.unix_mode() { + fs::set_permissions(&outpath, fs::Permissions::from_mode(mode))?; + } + } + } + + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test_env_log::test] + fn test_zip_extraction() { + let temp_dir = tempfile::tempdir().expect("Can't create a temp directory"); + let response = + reqwest::blocking::get("https://nodejs.org/dist/v12.0.0/node-v12.0.0-win-x64.zip") + .expect("Can't make request to Node v12.0.0 zip file"); + Zip::new(response) + .extract_into(&temp_dir) + .expect("Can't unzip files"); + let node_file = temp_dir + .as_ref() + .join("node-v12.0.0-win-x64") + .join("node.exe"); + assert!(node_file.exists()); + } +} diff --git a/src/choose_version_for_user_input.rs b/src/choose_version_for_user_input.rs new file mode 100644 index 0000000..066bc8b --- /dev/null +++ b/src/choose_version_for_user_input.rs @@ -0,0 +1,77 @@ +use crate::config::FnmConfig; +use crate::installed_versions; +use crate::system_version; +use crate::user_version::UserVersion; +use crate::version::Version; +use colored::Colorize; +use log::info; +use snafu::{ensure, ResultExt, Snafu}; +use std::path::{Path, PathBuf}; + +pub struct ApplicableVersion { + path: PathBuf, + version: Version, +} + +impl ApplicableVersion { + pub fn path(&self) -> &Path { + &self.path + } + + pub fn version(&self) -> &Version { + &self.version + } +} + +pub fn choose_version_for_user_input<'a>( + requested_version: &'a UserVersion, + config: &'a FnmConfig, +) -> Result, Error> { + let all_versions = + installed_versions::list(config.installations_dir()).context(VersionListing)?; + + let result = if let UserVersion::Full(Version::Bypassed) = requested_version { + info!("Bypassing fnm: using {} node", "system".cyan()); + Some(ApplicableVersion { + path: system_version::path(), + version: Version::Bypassed, + }) + } else if let Some(alias_name) = requested_version.alias_name() { + let alias_path = config.aliases_dir().join(&alias_name); + ensure!( + alias_path.exists(), + CantFindVersion { + requested_version: requested_version.clone() + } + ); + info!("Using Node for alias {}", alias_name.cyan()); + Some(ApplicableVersion { + path: alias_path, + version: Version::Alias(alias_name), + }) + } else { + let current_version = requested_version.to_version(&all_versions); + current_version.map(|version| { + info!("Using Node {}", version.to_string().cyan()); + let path = config + .installations_dir() + .join(version.to_string()) + .join("installation"); + + ApplicableVersion { + path, + version: version.clone(), + } + }) + }; + + Ok(result) +} + +#[derive(Debug, Snafu)] +pub enum Error { + #[snafu(display("Can't find requested version: {}", requested_version))] + CantFindVersion { requested_version: UserVersion }, + #[snafu(display("Can't list local installed versions: {}", source))] + VersionListing { source: installed_versions::Error }, +} diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..9e2f884 --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,61 @@ +use crate::commands; +use crate::commands::command::Command; +use crate::config::FnmConfig; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +pub enum SubCommand { + #[structopt(name = "ls-remote", about = "List all remote Node.js versions")] + LsRemote(commands::ls_remote::LsRemote), + #[structopt(name = "ls", about = "List all local Node.js versions")] + LsLocal(commands::ls_local::LsLocal), + #[structopt(name = "install", about = "Install a new Node.js version")] + Install(commands::install::Install), + #[structopt(name = "use", about = "Change Node.js version")] + Use(commands::r#use::Use), + #[structopt( + name = "env", + about = "Print and setup required environment variables for fnm" + )] + Env(commands::env::Env), + #[structopt(name = "completions", about = "Create completions file")] + Completions(commands::completions::Completions), + #[structopt(name = "alias", about = "alias a version to a common name")] + Alias(commands::alias::Alias), + #[structopt(name = "default", about = "set a version as the default version")] + Default(commands::default::Default), + #[structopt(name = "current", about = "The current version")] + Current(commands::current::Current), + #[structopt(name = "exec", about = "Run a command with in fnm context")] + Exec(commands::exec::Exec), +} + +impl SubCommand { + pub fn call(self, config: FnmConfig) { + match self { + Self::LsLocal(cmd) => cmd.call(config), + Self::LsRemote(cmd) => cmd.call(config), + Self::Install(cmd) => cmd.call(config), + Self::Env(cmd) => cmd.call(config), + Self::Use(cmd) => cmd.call(config), + Self::Completions(cmd) => cmd.call(config), + Self::Alias(cmd) => cmd.call(config), + Self::Default(cmd) => cmd.call(config), + Self::Current(cmd) => cmd.call(config), + Self::Exec(cmd) => cmd.call(config), + } + } +} + +#[derive(StructOpt, Debug)] +#[structopt(name = "fnm")] +pub struct Cli { + #[structopt(flatten)] + pub config: FnmConfig, + #[structopt(subcommand)] + pub subcmd: SubCommand, +} + +pub fn parse() -> Cli { + Cli::from_args() +} diff --git a/src/commands/alias.rs b/src/commands/alias.rs new file mode 100644 index 0000000..506ef88 --- /dev/null +++ b/src/commands/alias.rs @@ -0,0 +1,45 @@ +use super::command::Command; +use crate::alias::create_alias; +use crate::choose_version_for_user_input::{ + choose_version_for_user_input, Error as ApplicableVersionError, +}; +use crate::config::FnmConfig; +use crate::installed_versions; +use crate::user_version::UserVersion; +use snafu::{OptionExt, ResultExt, Snafu}; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +pub struct Alias { + pub(crate) to_version: UserVersion, + pub(crate) name: String, +} + +impl Command for Alias { + type Error = Error; + + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { + let applicable_version = choose_version_for_user_input(&self.to_version, config) + .context(CantUnderstandVersion)? + .context(VersionNotFound { + version: self.to_version, + })?; + + create_alias(&config, &self.name, applicable_version.version()) + .context(CantCreateSymlink)?; + + Ok(()) + } +} + +#[derive(Debug, Snafu)] +pub enum Error { + #[snafu(display("Can't create symlink for alias: {}", source))] + CantCreateSymlink { source: std::io::Error }, + #[snafu(display("Can't list local installed versions: {}", source))] + VersionListingError { source: installed_versions::Error }, + #[snafu(display("Version {} not found locally", version))] + VersionNotFound { version: UserVersion }, + #[snafu(display("{}", source))] + CantUnderstandVersion { source: ApplicableVersionError }, +} diff --git a/src/commands/command.rs b/src/commands/command.rs new file mode 100644 index 0000000..8d4fa02 --- /dev/null +++ b/src/commands/command.rs @@ -0,0 +1,21 @@ +use crate::config::FnmConfig; +use crate::outln; +use colored::Colorize; + +pub trait Command: Sized { + type Error: std::error::Error; + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error>; + + fn handle_error(err: Self::Error, config: &FnmConfig) { + let err_s = format!("{}", err); + outln!(config#Error, "{} {}", "error:".red().bold(), err_s.red()); + std::process::exit(1); + } + + fn call(self, config: FnmConfig) { + match self.apply(&config) { + Ok(()) => (), + Err(err) => Self::handle_error(err, &config), + } + } +} diff --git a/src/commands/completions.rs b/src/commands/completions.rs new file mode 100644 index 0000000..494fd6f --- /dev/null +++ b/src/commands/completions.rs @@ -0,0 +1,27 @@ +use super::command::Command; +use crate::cli::Cli; +use crate::config::FnmConfig; +use crate::shell::infer_shell; +use structopt::clap::Shell; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +pub struct Completions { + /// The shell syntax to use. Infers when missing. + #[structopt(long, possible_values = &Shell::variants())] + shell: Option, +} + +impl Command for Completions { + type Error = Error; + + fn apply(self, _config: &FnmConfig) -> Result<(), Self::Error> { + let mut stdio = std::io::stdout(); + let shell = self.shell.unwrap_or_else(|| infer_shell().into()); + Cli::clap().gen_completions_to(env!("CARGO_PKG_NAME"), shell, &mut stdio); + Ok(()) + } +} + +#[derive(snafu::Snafu, Debug)] +pub enum Error {} diff --git a/src/commands/current.rs b/src/commands/current.rs new file mode 100644 index 0000000..7d2b4a0 --- /dev/null +++ b/src/commands/current.rs @@ -0,0 +1,20 @@ +use super::command::Command; +use crate::config::FnmConfig; +use crate::current_version::{current_version, Error}; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +pub struct Current {} + +impl Command for Current { + type Error = Error; + + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { + let version_string = match current_version(&config)? { + Some(ver) => ver.v_str(), + None => "none".into(), + }; + println!("{}", version_string); + Ok(()) + } +} diff --git a/src/commands/default.rs b/src/commands/default.rs new file mode 100644 index 0000000..603302d --- /dev/null +++ b/src/commands/default.rs @@ -0,0 +1,24 @@ +use super::alias::Alias; +use super::command::Command; +use crate::config::FnmConfig; +use crate::user_version::UserVersion; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +pub struct Default { + version: UserVersion, +} + +impl Command for Default { + type Error = super::alias::Error; + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { + Alias { + name: "default".into(), + to_version: self.version, + } + .apply(config) + } + fn handle_error(err: Self::Error, config: &FnmConfig) { + Alias::handle_error(err, config) + } +} diff --git a/src/commands/env.rs b/src/commands/env.rs new file mode 100644 index 0000000..a2369e5 --- /dev/null +++ b/src/commands/env.rs @@ -0,0 +1,106 @@ +use super::command::Command; +use crate::config::FnmConfig; +use crate::fs::symlink_dir; +use crate::outln; +use crate::shell::{infer_shell, Shell, AVAILABLE_SHELLS}; +use colored::Colorize; +use std::fmt::Debug; +use structopt::StructOpt; + +#[derive(StructOpt, Debug, Default)] +pub struct Env { + /// The shell syntax to use. Infers when missing. + #[structopt(long)] + #[structopt(possible_values = AVAILABLE_SHELLS)] + shell: Option>, + /// Deprecated. This is the default now. + #[structopt(long)] + multi: bool, + /// Print the script to change Node versions every directory change + #[structopt(long)] + use_on_cd: bool, +} + +fn generate_symlink_path(root: &std::path::Path) -> std::path::PathBuf { + let temp_dir_name = format!( + "fnm_multishell_{}_{}", + std::process::id(), + chrono::Utc::now().timestamp_millis(), + ); + root.join(temp_dir_name) +} + +fn make_symlink(config: &FnmConfig) -> std::path::PathBuf { + let system_temp_dir = std::env::temp_dir(); + let mut temp_dir = generate_symlink_path(&system_temp_dir); + + while temp_dir.exists() { + temp_dir = generate_symlink_path(&system_temp_dir); + } + + symlink_dir(config.default_version_dir(), &temp_dir).expect("Can't create symlink!"); + temp_dir +} + +impl Command for Env { + type Error = Error; + + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { + if self.multi { + outln!(config#Error, "{} {} is deprecated. This is now the default.", "warning:".yellow().bold(), "--multi".italic()); + } + + let shell: Box = self.shell.unwrap_or_else(&infer_shell); + let multishell_path = make_symlink(&config); + let binary_path = if cfg!(windows) { + multishell_path.clone() + } else { + multishell_path.join("bin") + }; + println!("{}", shell.path(&binary_path)); + println!( + "{}", + shell.set_env_var("FNM_MULTISHELL_PATH", multishell_path.to_str().unwrap()) + ); + println!( + "{}", + shell.set_env_var("FNM_DIR", config.base_dir_with_default().to_str().unwrap()) + ); + println!( + "{}", + shell.set_env_var("FNM_LOGLEVEL", config.log_level().clone().into()) + ); + println!( + "{}", + shell.set_env_var("FNM_NODE_DIST_MIRROR", config.node_dist_mirror.as_str()) + ); + if self.use_on_cd { + println!("{}", shell.use_on_cd(&config)); + } + Ok(()) + } +} + +#[derive(Debug, snafu::Snafu)] +pub enum Error {} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_smoke() { + use crate::shell; + let config = FnmConfig::default(); + let shell: Box = if cfg!(windows) { + Box::from(shell::WindowsCmd) + } else { + Box::from(shell::Bash) + }; + Env { + shell: Some(shell), + ..Env::default() + } + .call(config); + } +} diff --git a/src/commands/exec.rs b/src/commands/exec.rs new file mode 100644 index 0000000..4279cc0 --- /dev/null +++ b/src/commands/exec.rs @@ -0,0 +1,82 @@ +use super::command::Command as Cmd; +use crate::choose_version_for_user_input::choose_version_for_user_input; +use crate::choose_version_for_user_input::Error as UserInputError; +use crate::config::FnmConfig; +use crate::user_version::UserVersion; +use crate::version_files::get_user_version_from_file; +use snafu::{OptionExt, ResultExt, Snafu}; +use std::process::{Command, Stdio}; +use structopt::StructOpt; + +#[derive(Debug, StructOpt)] +pub struct Exec { + binary: String, + arguments: Vec, + #[structopt(long = "using")] + version: Option, +} + +impl Cmd for Exec { + type Error = Error; + + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { + let version = self + .version + .or_else(|| { + let current_dir = std::env::current_dir().unwrap(); + get_user_version_from_file(current_dir) + }) + .context(CantInferVersion)?; + + let applicable_version = choose_version_for_user_input(&version, &config) + .context(ApplicableVersionError)? + .context(VersionNotFound { version })?; + + #[cfg(windows)] + let bin_path = applicable_version.path().to_path_buf(); + + #[cfg(unix)] + let bin_path = applicable_version.path().join("bin"); + + let path_env = { + let paths_env = std::env::var_os("PATH").context(CantReadPathVariable)?; + let mut paths: Vec<_> = std::env::split_paths(&paths_env).collect(); + paths.insert(0, bin_path); + std::env::join_paths(paths).context(CantAddPathToEnvironment)? + }; + + let exit_status = Command::new(&self.binary) + .args(self.arguments) + .stdin(Stdio::inherit()) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .env("PATH", path_env) + .spawn() + .expect("Can't spawn program") + .wait() + .expect("Failed to grab exit code"); + + std::process::exit(exit_status.code().unwrap()); + } +} + +#[derive(Debug, Snafu)] +pub enum Error { + #[snafu(display("Can't read path environment variable"))] + CantReadPathVariable, + #[snafu(display("Can't add path to environment variable: {}", source))] + CantAddPathToEnvironment { + source: std::env::JoinPathsError, + }, + #[snafu(display( + "Can't find version in dotfiles. Please provide a version manually to the command." + ))] + CantInferVersion, + #[snafu(display("Requested version {} is not currently installed", version))] + VersionNotFound { + version: UserVersion, + }, + ApplicableVersionError { + source: UserInputError, + }, +} diff --git a/src/commands/install.rs b/src/commands/install.rs new file mode 100644 index 0000000..b92c029 --- /dev/null +++ b/src/commands/install.rs @@ -0,0 +1,153 @@ +use crate::alias::create_alias; +use crate::config::FnmConfig; +use crate::downloader::{install_node_dist, Error as DownloaderError}; +use crate::lts::LtsType; +use crate::outln; +use crate::remote_node_index; +use crate::user_version::UserVersion; +use crate::version::Version; +use crate::version_files::get_user_version_from_file; +use colored::Colorize; +use log::debug; +use snafu::{ensure, OptionExt, ResultExt, Snafu}; +use structopt::StructOpt; + +#[derive(StructOpt, Debug, Default)] +pub struct Install { + /// A version string. Can be a partial semver or a LTS version name by the format lts/NAME + pub version: Option, + + /// Install latest LTS + #[structopt(long)] + pub lts: bool, +} + +impl Install { + fn version(self) -> Result, Error> { + match self { + Self { + version: Some(_), + lts: true, + } => Err(Error::TooManyVersionsProvided), + Self { + version: v, + lts: false, + } => Ok(v), + Self { + version: None, + lts: true, + } => Ok(Some(UserVersion::Full(Version::Lts(LtsType::Latest)))), + } + } +} + +impl super::command::Command for Install { + type Error = Error; + + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { + let current_dir = std::env::current_dir().unwrap(); + let current_version = self + .version()? + .or_else(|| get_user_version_from_file(current_dir)) + .context(CantInferVersion)?; + + let version = match current_version.clone() { + UserVersion::Full(Version::Semver(actual_version)) => Version::Semver(actual_version), + UserVersion::Full(v @ Version::Bypassed) | UserVersion::Full(v @ Version::Alias(_)) => { + ensure!(false, UninstallableVersion { version: v }); + unreachable!(); + } + UserVersion::Full(Version::Lts(lts_type)) => { + let available_versions: Vec<_> = remote_node_index::list(&config.node_dist_mirror) + .context(CantListRemoteVersions)?; + let picked_version = lts_type + .pick_latest(&available_versions) + .with_context(|| CantFindRelevantLts { + lts_type: lts_type.clone(), + })? + .version + .clone(); + debug!( + "Resolved {} into Node version {}", + Version::Lts(lts_type).v_str().cyan(), + picked_version.v_str().cyan() + ); + picked_version + } + current_version => { + let available_versions: Vec<_> = remote_node_index::list(&config.node_dist_mirror) + .context(CantListRemoteVersions)? + .drain(..) + .map(|x| x.version) + .collect(); + + current_version + .to_version(&available_versions) + .context(CantFindNodeVersion { + requested_version: current_version, + })? + .clone() + } + }; + let version_str = format!("Node {}", &version); + outln!(config#Info, "Installing {}", version_str.cyan()); + match install_node_dist( + &version, + &config.node_dist_mirror, + config.installations_dir(), + ) { + Err(err @ DownloaderError::VersionAlreadyInstalled { .. }) => { + outln!(config#Error, "{} {}", "warning:".bold().yellow(), err); + } + other_err => other_err.context(DownloadError)?, + }; + + if let UserVersion::Full(Version::Lts(lts_type)) = current_version { + let alias_name = Version::Lts(lts_type).v_str(); + debug!( + "Tagging {} as alias for {}", + alias_name.cyan(), + version.v_str().cyan() + ); + create_alias(&config, &alias_name, &version).context(IoError)?; + } + + Ok(()) + } +} + +#[derive(Debug, Snafu)] +pub enum Error { + #[snafu(display("Can't download the requested version: {}", source))] + DownloadError { + source: DownloaderError, + }, + IoError { + source: std::io::Error, + }, + #[snafu(display( + "Can't find version in dotfiles. Please provide a version manually to the command." + ))] + CantInferVersion, + #[snafu(display("Having a hard time listing the remote versions: {}", source))] + CantListRemoteVersions { + source: reqwest::Error, + }, + #[snafu(display( + "Can't find a Node version that matches {} in remote", + requested_version + ))] + CantFindNodeVersion { + requested_version: UserVersion, + }, + #[snafu(display("Can't find relevant LTS named {}", lts_type))] + CantFindRelevantLts { + lts_type: crate::lts::LtsType, + }, + #[snafu(display("The requested version is not installable: {}", version.v_str()))] + UninstallableVersion { + version: Version, + }, + #[snafu(display("Too many versions provided. Please don't use --lts with a version string."))] + TooManyVersionsProvided, +} diff --git a/src/commands/ls_local.rs b/src/commands/ls_local.rs new file mode 100644 index 0000000..ce635bf --- /dev/null +++ b/src/commands/ls_local.rs @@ -0,0 +1,79 @@ +use crate::alias::{list_aliases, StoredAlias}; +use crate::config::FnmConfig; +use crate::current_version::current_version; +use crate::outln; +use crate::version::Version; +use colored::*; +use snafu::{ResultExt, Snafu}; +use std::collections::HashMap; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +pub struct LsLocal {} + +impl super::command::Command for LsLocal { + type Error = Error; + + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { + let base_dir = config.installations_dir(); + let mut versions: Vec<_> = std::fs::read_dir(&base_dir) + .context(CantListLocallyInstalledVersion)? + .filter_map(|x| { + if let Ok(version_dir) = x { + let file_name = version_dir.file_name(); + file_name.to_str().and_then(|x| Version::parse(x).ok()) + } else { + None + } + }) + .collect(); + versions.insert(0, Version::Bypassed); + versions.sort(); + let aliases_hash = generate_aliases_hash(&config).context(CantReadAliases)?; + let curr_version = current_version(&config).ok().flatten(); + + for version in versions { + let version_aliases = match aliases_hash.get(&version.v_str()) { + None => "".into(), + Some(versions) => { + let version_string = versions + .iter() + .map(|x| x.name()) + .collect::>() + .join(", "); + format!(" {}", version_string.dimmed()) + } + }; + + let version_str = format!("* {}{}", version, version_aliases); + + if curr_version == Some(version) { + outln!(config#Info, "{}", version_str.cyan()); + } else { + outln!(config#Info, "{}", version_str); + } + } + Ok(()) + } +} + +fn generate_aliases_hash(config: &FnmConfig) -> std::io::Result>> { + let mut aliases = list_aliases(&config)?; + let mut hashmap: HashMap> = HashMap::with_capacity(aliases.len()); + for alias in aliases.drain(..) { + if let Some(value) = hashmap.get_mut(alias.s_ver()) { + value.push(alias); + } else { + hashmap.insert(alias.s_ver().into(), vec![alias]); + } + } + Ok(hashmap) +} + +#[derive(Debug, Snafu)] +pub enum Error { + #[snafu(display("Can't list locally installed versions: {}", source))] + CantListLocallyInstalledVersion { source: std::io::Error }, + #[snafu(display("Can't read aliases: {}", source))] + CantReadAliases { source: std::io::Error }, +} diff --git a/src/commands/ls_remote.rs b/src/commands/ls_remote.rs new file mode 100644 index 0000000..9855ef9 --- /dev/null +++ b/src/commands/ls_remote.rs @@ -0,0 +1,32 @@ +use crate::config::FnmConfig; +use crate::remote_node_index; +use snafu::{ResultExt, Snafu}; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +pub struct LsRemote {} + +impl super::command::Command for LsRemote { + type Error = Error; + + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { + let mut all_versions = + remote_node_index::list(&config.node_dist_mirror).context(HttpError)?; + all_versions.sort(); + + for version in all_versions { + print!("{}", version.version); + if let Some(lts) = &version.lts { + print!(" ({})", lts); + } + println!(); + } + + Ok(()) + } +} + +#[derive(Debug, Snafu)] +pub enum Error { + HttpError { source: reqwest::Error }, +} diff --git a/src/commands/mod.rs b/src/commands/mod.rs new file mode 100644 index 0000000..7c664d7 --- /dev/null +++ b/src/commands/mod.rs @@ -0,0 +1,11 @@ +pub mod alias; +pub mod command; +pub mod completions; +pub mod current; +pub mod default; +pub mod env; +pub mod exec; +pub mod install; +pub mod ls_local; +pub mod ls_remote; +pub mod r#use; diff --git a/src/commands/use.rs b/src/commands/use.rs new file mode 100644 index 0000000..50d7418 --- /dev/null +++ b/src/commands/use.rs @@ -0,0 +1,137 @@ +use super::command::Command; +use super::install::Install; +use crate::config::FnmConfig; +use crate::fs; +use crate::installed_versions; +use crate::outln; +use crate::system_version; +use crate::user_version::UserVersion; +use crate::version::Version; +use crate::version_files::get_user_version_from_file; +use colored::Colorize; +use snafu::{ensure, OptionExt, ResultExt, Snafu}; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +pub struct Use { + version: Option, + /// Install the version if it isn't installed yet + #[structopt(long)] + install_if_missing: bool, +} + +impl Command for Use { + type Error = Error; + + fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { + let all_versions = + installed_versions::list(config.installations_dir()).context(VersionListingError)?; + let requested_version = self + .version + .or_else(|| { + let current_dir = std::env::current_dir().unwrap(); + get_user_version_from_file(current_dir) + }) + .context(CantInferVersion)?; + + let version_path = if let UserVersion::Full(Version::Bypassed) = requested_version { + outln!(config#Info, "Bypassing fnm: using {} node", "system".cyan()); + system_version::path() + } else if let Some(alias_name) = requested_version.alias_name() { + let alias_path = config.aliases_dir().join(&alias_name); + ensure!( + alias_path.exists(), + CantFindVersion { + version: requested_version + } + ); + outln!(config#Info, "Using Node for alias {}", alias_name.cyan()); + alias_path + } else { + let current_version = requested_version.to_version(&all_versions); + match current_version { + Some(version) => { + outln!(config#Info, "Using Node {}", version.to_string().cyan()); + config + .installations_dir() + .join(version.to_string()) + .join("installation") + } + None => { + ensure!( + self.install_if_missing || should_install_interactively(&requested_version), + CantFindVersion { + version: requested_version + } + ); + + Install { + version: Some(requested_version.clone()), + ..Default::default() + } + .apply(config) + .context(InstallError)?; + + Self { + version: Some(requested_version), + install_if_missing: self.install_if_missing, + } + .apply(config)?; + + return Ok(()); + } + } + }; + + let multishell_path = config + .multishell_path() + .expect("fnm isn't set up. Have you tried running `fnm env`?"); + + fs::remove_symlink_dir(&multishell_path).context(SymlinkingDeletionIssue)?; + fs::symlink_dir(version_path, &multishell_path).context(SymlinkingCreationIssue)?; + + Ok(()) + } +} + +fn should_install_interactively(requested_version: &UserVersion) -> bool { + if !(atty::is(atty::Stream::Stdout) && atty::is(atty::Stream::Stdin)) { + return false; + } + + use std::io::Write; + let error_message = format!( + "Can't find version that matches {}.", + requested_version.to_string().italic() + ); + eprintln!("{}", error_message.red()); + let do_you_want = format!("Do you want to install it? {} [y/n]:", "answer".bold()); + eprint!("{} ", do_you_want.yellow()); + std::io::stdout().flush().unwrap(); + let mut s = String::new(); + std::io::stdin() + .read_line(&mut s) + .expect("Can't read user input"); + + s.trim().to_lowercase() == "y" +} + +#[derive(Debug, Snafu)] +pub enum Error { + #[snafu(display("Can't create the symlink: {}", source))] + SymlinkingCreationIssue { source: std::io::Error }, + #[snafu(display("Can't delete the symlink: {}", source))] + SymlinkingDeletionIssue { source: std::io::Error }, + #[snafu(display("{}", source))] + InstallError { source: ::Error }, + #[snafu(display("Can't get locally installed versions: {}", source))] + VersionListingError { + source: crate::installed_versions::Error, + }, + #[snafu(display("Requested version {} is not currently installed", version))] + CantFindVersion { version: UserVersion }, + #[snafu(display( + "Can't find version in dotfiles. Please provide a version manually to the command." + ))] + CantInferVersion, +} diff --git a/src/config.rs b/src/config.rs new file mode 100644 index 0000000..0e6fdb6 --- /dev/null +++ b/src/config.rs @@ -0,0 +1,74 @@ +use crate::log_level::LogLevel; +use dirs::home_dir; +use structopt::StructOpt; + +#[derive(StructOpt, Debug)] +pub struct FnmConfig { + /// https://nodejs.org/dist/ mirror + #[structopt( + long, + env = "FNM_NODE_DIST_MIRROR", + default_value = "https://nodejs.org/dist" + )] + pub node_dist_mirror: reqwest::Url, + + /// The root directory of fnm installations. + #[structopt(long = "fnm-dir", env = "FNM_DIR")] + pub base_dir: Option, + + /// Where the current node version link is stored + #[structopt(long, env = "FNM_MULTISHELL_PATH")] + multishell_path: Option, + + /// The log level of fnm commands + #[structopt(long, env = "FNM_LOGLEVEL", default_value = "info")] + log_level: LogLevel, +} + +impl Default for FnmConfig { + fn default() -> Self { + Self { + node_dist_mirror: reqwest::Url::parse("https://nodejs.org/dist/").unwrap(), + base_dir: None, + multishell_path: None, + log_level: LogLevel::Info, + } + } +} + +impl FnmConfig { + pub fn multishell_path(&self) -> Option<&std::path::Path> { + match &self.multishell_path { + None => None, + Some(v) => Some(v.as_path()), + } + } + + pub fn log_level(&self) -> &LogLevel { + &self.log_level + } + + pub fn base_dir_with_default(&self) -> std::path::PathBuf { + ensure_exists_silently( + (self.base_dir.clone()) + .unwrap_or_else(|| home_dir().expect("Can't get home directory").join(".fnm")), + ) + } + + pub fn installations_dir(&self) -> std::path::PathBuf { + ensure_exists_silently(self.base_dir_with_default().join("node-versions")) + } + + pub fn default_version_dir(&self) -> std::path::PathBuf { + self.aliases_dir().join("default") + } + + pub fn aliases_dir(&self) -> std::path::PathBuf { + ensure_exists_silently(self.base_dir_with_default().join("aliases")) + } +} + +fn ensure_exists_silently>(path: T) -> T { + std::fs::create_dir_all(path.as_ref()).ok(); + path +} diff --git a/src/current_version.rs b/src/current_version.rs new file mode 100644 index 0000000..88c5342 --- /dev/null +++ b/src/current_version.rs @@ -0,0 +1,40 @@ +use crate::config::FnmConfig; +use crate::system_version; +use crate::version::Version; +use snafu::{OptionExt, ResultExt, Snafu}; + +pub fn current_version(config: &FnmConfig) -> Result, Error> { + let multishell_path = config.multishell_path().context(EnvNotApplied)?; + + if multishell_path.read_link().ok() == Some(system_version::path()) { + return Ok(Some(Version::Bypassed)); + } + + if let Ok(resolved_path) = std::fs::canonicalize(multishell_path) { + let installation_path = resolved_path + .parent() + .expect("multishell path can't be in the root"); + let file_name = installation_path + .file_name() + .expect("Can't get filename") + .to_str() + .expect("Invalid OS string"); + let version = Version::parse(file_name).context(VersionError { version: file_name })?; + Ok(Some(version)) + } else { + Ok(None) + } +} + +#[derive(Debug, Snafu)] +pub enum Error { + #[snafu(display( + "`fnm env` was not applied in this context.\nCan't find fnm's environment variables" + ))] + EnvNotApplied, + #[snafu(display("Can't read the version as a valid semver"))] + VersionError { + source: semver::SemVerError, + version: String, + }, +} diff --git a/src/directory_portal.rs b/src/directory_portal.rs new file mode 100644 index 0000000..25f1e73 --- /dev/null +++ b/src/directory_portal.rs @@ -0,0 +1,63 @@ +use log::*; +use std::path::Path; +use tempfile::{tempdir, TempDir}; + +pub struct DirectoryPortal> { + temp_dir: TempDir, + target: P, +} + +impl> DirectoryPortal

{ + #[must_use] + pub fn new(target: P) -> Self { + let temp_dir = tempdir().expect("Can't generate a temp directory"); + debug!("Created a temp directory in {:?}", temp_dir.path()); + Self { target, temp_dir } + } + + pub fn teleport(self) -> std::io::Result

{ + debug!( + "Moving directory {:?} into {:?}", + self.temp_dir.path(), + self.target.as_ref() + ); + std::fs::rename(&self.temp_dir, &self.target)?; + Ok(self.target) + } +} + +impl> std::ops::Deref for DirectoryPortal

{ + type Target = Path; + fn deref(&self) -> &Self::Target { + self.as_ref() + } +} + +impl> AsRef for DirectoryPortal

{ + fn as_ref(&self) -> &Path { + self.temp_dir.as_ref() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use pretty_assertions::assert_eq; + + #[test] + fn test_portal() { + let tempdir = tempdir().expect("Can't generate a temp directory"); + let portal = DirectoryPortal::new(tempdir.path().join("subdir")); + let new_file_path = portal.to_path_buf().join("README.md"); + std::fs::write(&new_file_path, "Hello world!").expect("Can't write file"); + let target = portal.teleport().expect("Can't close directory portal"); + + let file_exists: Vec<_> = target + .read_dir() + .expect("Can't read dir") + .map(|x| x.unwrap().file_name().into_string().unwrap()) + .collect(); + + assert_eq!(file_exists, vec!["README.md"]); + } +} diff --git a/src/downloader.rs b/src/downloader.rs new file mode 100644 index 0000000..5cdbb48 --- /dev/null +++ b/src/downloader.rs @@ -0,0 +1,159 @@ +use crate::archive; +use crate::archive::{Error as ExtractError, Extract}; +use crate::directory_portal::DirectoryPortal; +use crate::version::Version; +use log::debug; +use reqwest::Url; +use snafu::{ensure, OptionExt, ResultExt, Snafu}; +use std::path::Path; +use std::path::PathBuf; + +#[derive(Debug, Snafu)] +pub enum Error { + HttpError { + source: reqwest::Error, + }, + IoError { + source: std::io::Error, + }, + #[snafu(display("Can't extract the file: {}", source))] + CantExtractFile { + source: ExtractError, + }, + #[snafu(display("The downloaded archive is empty"))] + TarIsEmpty, + #[snafu(display("Can't find version upstream"))] + VersionNotFound, + #[snafu(display("Version already installed at {:?}", path))] + VersionAlreadyInstalled { + path: PathBuf, + }, +} + +#[cfg(unix)] +fn filename_for_version(version: &Version) -> String { + use crate::system_info::{platform_arch, platform_name}; + format!( + "node-{node_ver}-{platform}-{arch}.tar.xz", + node_ver = &version, + platform = platform_name(), + arch = platform_arch(), + ) +} + +#[cfg(windows)] +fn filename_for_version(version: &Version) -> String { + format!( + "node-{node_ver}-win-{arch}.zip", + node_ver = &version, + arch = crate::system_info::platform_arch(), + ) +} + +fn download_url(base_url: &Url, version: &Version) -> Url { + Url::parse(&format!( + "{}/{}/{}", + base_url.as_str().trim_end_matches('/'), + version, + filename_for_version(version) + )) + .unwrap() +} + +pub fn extract_archive_into>( + path: P, + response: reqwest::blocking::Response, +) -> Result<(), Error> { + #[cfg(unix)] + let extractor = archive::TarXz::new(response); + #[cfg(windows)] + let extractor = archive::Zip::new(response); + extractor.extract_into(path).context(CantExtractFile)?; + Ok(()) +} + +/// Install a Node package +pub fn install_node_dist>( + version: &Version, + node_dist_mirror: &Url, + installations_dir: P, +) -> Result<(), Error> { + let installation_dir = PathBuf::from(installations_dir.as_ref()).join(version.v_str()); + + ensure!( + !installation_dir.exists(), + VersionAlreadyInstalled { + path: installation_dir + } + ); + + std::fs::create_dir_all(installations_dir.as_ref()).context(IoError)?; + let portal = DirectoryPortal::new(installation_dir); + + let url = download_url(node_dist_mirror, version); + debug!("Going to call for {}", &url); + let response = reqwest::blocking::get(url).context(HttpError)?; + + if response.status() == 404 { + return Err(Error::VersionNotFound); + } + + debug!("Extracting response..."); + extract_archive_into(&portal, response)?; + debug!("Extraction completed"); + + let installed_directory = std::fs::read_dir(&portal) + .context(IoError)? + .next() + .context(TarIsEmpty)? + .context(IoError)?; + let installed_directory = installed_directory.path(); + + let renamed_installation_dir = portal.join("installation"); + std::fs::rename(installed_directory, renamed_installation_dir).context(IoError)?; + + portal.teleport().context(IoError)?; + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::downloader::install_node_dist; + use crate::version::Version; + use pretty_assertions::assert_eq; + use std::io::Read; + use tempfile::tempdir; + + #[test_env_log::test] + fn test_installing_node_12() { + let version = Version::parse("12.0.0").unwrap(); + let node_dist_mirror = Url::parse("https://nodejs.org/dist/").unwrap(); + let installations_dir = tempdir().unwrap(); + install_node_dist(&version, &node_dist_mirror, &installations_dir) + .expect("Can't install Node 12"); + + let mut location_path = PathBuf::from(&installations_dir.path()); + location_path.push(version.v_str()); + location_path.push("installation"); + + if cfg!(unix) { + location_path.push("bin"); + } + + location_path.push("node"); + + let mut result = String::new(); + std::process::Command::new(location_path.to_str().unwrap()) + .arg("--version") + .stdout(std::process::Stdio::piped()) + .spawn() + .expect("Can't find node executable") + .stdout + .expect("Can't capture stdout") + .read_to_string(&mut result) + .expect("Failed reading stdout"); + assert_eq!(result.trim(), "v12.0.0"); + } +} diff --git a/src/fs.rs b/src/fs.rs new file mode 100644 index 0000000..877680e --- /dev/null +++ b/src/fs.rs @@ -0,0 +1,25 @@ +use std::path::Path; + +#[cfg(unix)] +pub fn symlink_dir, U: AsRef>(from: P, to: U) -> std::io::Result<()> { + std::os::unix::fs::symlink(from, to)?; + Ok(()) +} + +#[cfg(windows)] +pub fn symlink_dir, U: AsRef>(from: P, to: U) -> std::io::Result<()> { + std::os::windows::fs::symlink_dir(from, to)?; + Ok(()) +} + +#[cfg(windows)] +pub fn remove_symlink_dir>(path: P) -> std::io::Result<()> { + std::fs::remove_dir(path)?; + Ok(()) +} + +#[cfg(unix)] +pub fn remove_symlink_dir>(path: P) -> std::io::Result<()> { + std::fs::remove_file(path)?; + Ok(()) +} diff --git a/src/installed_versions.rs b/src/installed_versions.rs new file mode 100644 index 0000000..90cc1d7 --- /dev/null +++ b/src/installed_versions.rs @@ -0,0 +1,27 @@ +use crate::version::Version; +use snafu::{ResultExt, Snafu}; +use std::path::Path; + +pub fn list>(installations_dir: P) -> Result, Error> { + let mut vec = vec![]; + for result_entry in installations_dir.as_ref().read_dir().context(IoError)? { + let entry = result_entry.context(IoError)?; + let path = entry.path(); + let filename = path + .file_name() + .ok_or_else(|| std::io::Error::from(std::io::ErrorKind::NotFound)) + .context(IoError)? + .to_str() + .ok_or_else(|| std::io::Error::from(std::io::ErrorKind::NotFound)) + .context(IoError)?; + let version = Version::parse(filename).context(SemverError)?; + vec.push(version); + } + Ok(vec) +} + +#[derive(Debug, Snafu)] +pub enum Error { + IoError { source: std::io::Error }, + SemverError { source: semver::SemVerError }, +} diff --git a/src/log_level.rs b/src/log_level.rs new file mode 100644 index 0000000..783693e --- /dev/null +++ b/src/log_level.rs @@ -0,0 +1,71 @@ +#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Clone)] +pub enum LogLevel { + Quiet, + Error, + Info, +} + +impl LogLevel { + pub fn is_writable(&self, logging: &Self) -> bool { + use std::cmp::Ordering; + match self.cmp(logging) { + Ordering::Greater | Ordering::Equal => true, + _ => false, + } + } + + pub fn writer_for(&self, logging: &Self) -> Box { + if self.is_writable(logging) { + match logging { + Self::Error => Box::from(std::io::stderr()), + _ => Box::from(std::io::stdout()), + } + } else { + Box::from(std::io::sink()) + } + } +} + +impl Into<&'static str> for LogLevel { + fn into(self) -> &'static str { + match self { + Self::Quiet => "quiet", + Self::Info => "info", + Self::Error => "error", + } + } +} + +impl std::str::FromStr for LogLevel { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + "quiet" => Ok(Self::Quiet), + "info" => Ok(Self::Info), + "error" => Ok(Self::Error), + loglevel => Err(format!("I don't know the log level of {:?}", loglevel)), + } + } +} + +#[macro_export] +macro_rules! outln { + ($config:ident#$level:path, $($expr:expr),+) => {{ + use $crate::log_level::LogLevel::*; + writeln!($config.log_level().writer_for(&$level), $($expr),+).expect("Can't write output"); + }} +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_is_writable() { + assert!(!LogLevel::Quiet.is_writable(&LogLevel::Info)); + assert!(!LogLevel::Error.is_writable(&LogLevel::Info)); + assert!(LogLevel::Info.is_writable(&LogLevel::Info)); + assert!(LogLevel::Info.is_writable(&LogLevel::Error)); + } +} diff --git a/src/lts.rs b/src/lts.rs new file mode 100644 index 0000000..a256bb0 --- /dev/null +++ b/src/lts.rs @@ -0,0 +1,47 @@ +use crate::remote_node_index::IndexedNodeVersion; +use std::fmt::Display; + +#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Clone)] +pub enum LtsType { + /// lts-*, lts/* + Latest, + /// lts-erbium, lts/erbium + CodeName(String), +} + +impl From<&str> for LtsType { + fn from(s: &str) -> Self { + if s == "*" || s == "latest" { + Self::Latest + } else { + Self::CodeName(s.to_string()) + } + } +} + +impl Display for LtsType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Latest => write!(f, "latest"), + Self::CodeName(s) => write!(f, "{}", s), + } + } +} + +impl LtsType { + pub fn pick_latest<'vec>( + &self, + versions: &'vec [IndexedNodeVersion], + ) -> Option<&'vec IndexedNodeVersion> { + match self { + Self::Latest => versions.iter().filter(|x| x.lts.is_some()).last(), + Self::CodeName(s) => versions + .iter() + .filter(|x| match &x.lts { + None => false, + Some(x) => s.to_lowercase() == x.to_lowercase(), + }) + .last(), + } + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..db74201 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,28 @@ +mod alias; +mod archive; +mod choose_version_for_user_input; +mod cli; +mod commands; +mod config; +mod current_version; +mod directory_portal; +mod downloader; +mod fs; +mod installed_versions; +mod lts; +mod remote_node_index; +mod shell; +mod system_info; +mod system_version; +mod user_version; +mod version; +mod version_files; + +#[macro_use] +mod log_level; + +fn main() { + env_logger::init(); + let value = crate::cli::parse(); + value.subcmd.call(value.config); +} diff --git a/src/remote_node_index.rs b/src/remote_node_index.rs new file mode 100644 index 0000000..26a11d9 --- /dev/null +++ b/src/remote_node_index.rs @@ -0,0 +1,110 @@ +use crate::version::Version; +use serde::Deserialize; + +mod lts_status { + use serde::{Deserialize, Deserializer}; + + #[derive(Deserialize, Debug, PartialEq, Eq)] + #[serde(untagged)] + enum LtsStatus { + Nope(bool), + Yes(String), + } + + impl Into> for LtsStatus { + fn into(self) -> Option { + match self { + Self::Nope(_) => None, + Self::Yes(x) => Some(x), + } + } + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + Ok(LtsStatus::deserialize(deserializer)?.into()) + } + + #[cfg(test)] + mod tests { + use super::*; + use pretty_assertions::assert_eq; + + #[derive(Deserialize)] + struct TestSubject { + #[serde(deserialize_with = "deserialize")] + lts: Option, + } + + #[test] + fn test_false_deserialization() { + let json = serde_json::json!({ "lts": false }); + let subject: TestSubject = + serde_json::from_value(json).expect("Can't deserialize json"); + assert_eq!(subject.lts, None); + } + + #[test] + fn test_value_deserialization() { + let json = serde_json::json!({ "lts": "dubnium" }); + let subject: TestSubject = + serde_json::from_value(json).expect("Can't deserialize json"); + assert_eq!(subject.lts, Some("dubnium".into())); + } + } +} + +#[derive(Deserialize, Debug, Eq, Ord)] +pub struct IndexedNodeVersion { + pub version: Version, + #[serde(with = "lts_status")] + pub lts: Option, + pub date: chrono::NaiveDate, + pub files: Vec, +} + +impl PartialEq for IndexedNodeVersion { + fn eq(&self, other: &Self) -> bool { + self.version.eq(&other.version) + } +} + +impl PartialOrd for IndexedNodeVersion { + fn partial_cmp(&self, other: &Self) -> Option { + self.version.partial_cmp(&other.version) + } +} + +/// Prints +/// +/// ```rust +/// use crate::remote_node_index::list; +/// ``` +pub fn list(base_url: &reqwest::Url) -> Result, reqwest::Error> { + let index_json_url = format!("{}/index.json", base_url); + let mut value: Vec = reqwest::blocking::get(&index_json_url)?.json()?; + value.sort(); + Ok(value) +} + +#[cfg(test)] +mod tests { + use super::*; + use pretty_assertions::assert_eq; + + #[test] + fn test_list() { + let base_url = reqwest::Url::parse("https://nodejs.org/dist").unwrap(); + let expected_version = Version::parse("12.0.0").unwrap(); + let mut versions = list(&base_url).expect("Can't get HTTP data"); + assert_eq!( + versions + .drain(..) + .find(|x| x.version == expected_version) + .map(|x| x.version), + Some(expected_version) + ); + } +} diff --git a/src/shell/bash.rs b/src/shell/bash.rs new file mode 100644 index 0000000..3099bda --- /dev/null +++ b/src/shell/bash.rs @@ -0,0 +1,41 @@ +use super::shell::Shell; +use indoc::indoc; +use std::path::PathBuf; + +#[derive(Debug)] +pub struct Bash; + +impl Shell for Bash { + fn into_structopt_shell(&self) -> structopt::clap::Shell { + structopt::clap::Shell::Bash + } + + fn path(&self, path: &PathBuf) -> String { + format!("export PATH={:?}:$PATH", path.to_str().unwrap()) + } + + fn set_env_var(&self, name: &str, value: &str) -> String { + format!("export {}={:?}", name, value) + } + + fn use_on_cd(&self, _config: &crate::config::FnmConfig) -> String { + indoc!( + r#" + __fnmcd () { + cd "$@" + + if [[ -f .node-version && .node-version ]]; then + echo "fnm: Found .node-version" + fnm use + elif [[ -f .nvmrc && .nvmrc ]]; then + echo "fnm: Found .nvmrc" + fnm use + fi + } + + alias cd=__fnmcd + "# + ) + .into() + } +} diff --git a/src/shell/fish.rs b/src/shell/fish.rs new file mode 100644 index 0000000..5e3fec5 --- /dev/null +++ b/src/shell/fish.rs @@ -0,0 +1,38 @@ +use super::shell::Shell; +use indoc::indoc; +use std::path::PathBuf; + +#[derive(Debug)] +pub struct Fish; + +impl Shell for Fish { + fn into_structopt_shell(&self) -> structopt::clap::Shell { + structopt::clap::Shell::Fish + } + + fn path(&self, path: &PathBuf) -> String { + format!("set -gx PATH {:?} $PATH;", path.to_str().unwrap()) + } + + fn set_env_var(&self, name: &str, value: &str) -> String { + format!("set -gx {name} {value:?};", name = name, value = value) + } + + fn use_on_cd(&self, _config: &crate::config::FnmConfig) -> String { + indoc!( + r#" + function _fnm_autoload_hook --on-variable PWD --description 'Change Node version on directory change' + status --is-command-substitution; and return + if test -f .node-version + echo "fnm: Found .node-version" + fnm use + else if test -f .nvmrc + echo "fnm: Found .nvmrc" + fnm use + end + end + "# + ) + .into() + } +} diff --git a/src/shell/infer/mod.rs b/src/shell/infer/mod.rs new file mode 100644 index 0000000..1bffc2d --- /dev/null +++ b/src/shell/infer/mod.rs @@ -0,0 +1,11 @@ +#[cfg(unix)] +pub mod unix; + +#[cfg(windows)] +pub mod windows; + +#[derive(Debug)] +struct ProcessInfo { + parent_pid: Option, + command: String, +} diff --git a/src/shell/infer/unix.rs b/src/shell/infer/unix.rs new file mode 100644 index 0000000..4b58dce --- /dev/null +++ b/src/shell/infer/unix.rs @@ -0,0 +1,92 @@ +#![cfg(unix)] + +use super::super::{Bash, Fish, PowerShell, Shell, Zsh}; +use std::io::{Error, ErrorKind}; + +#[derive(Debug)] +struct ProcessInfo { + parent_pid: Option, + command: String, +} + +const MAX_ITERATIONS: u8 = 10; + +pub fn infer_shell() -> Option> { + let mut pid = Some(std::process::id()); + let mut visited = 0; + + while pid != None && visited < MAX_ITERATIONS { + let process_info = get_process_info(pid.unwrap()).ok()?; + + match process_info.command.as_str().trim_start_matches('-') { + "sh" | "bash" => return Some(Box::from(Bash)), + "zsh" => return Some(Box::from(Zsh)), + "fish" => return Some(Box::from(Fish)), + "pwsh" => return Some(Box::from(PowerShell)), + _ => (), + }; + + pid = process_info.parent_pid; + visited += 1; + } + + None +} + +fn get_process_info(pid: u32) -> std::io::Result { + use std::io::{BufRead, BufReader}; + use std::process::Command; + + let buffer = Command::new("ps") + .arg("-o") + .arg("ppid,comm") + .arg(pid.to_string()) + .stdout(std::process::Stdio::piped()) + .spawn()? + .stdout + .ok_or_else(|| Error::from(ErrorKind::UnexpectedEof))?; + + let mut lines = BufReader::new(buffer).lines(); + + // skip header line + lines + .next() + .ok_or_else(|| Error::from(ErrorKind::UnexpectedEof))??; + + let line = lines + .next() + .ok_or_else(|| Error::from(ErrorKind::NotFound))??; + + let mut parts = line.trim().split_whitespace(); + let ppid = parts + .next() + .expect("Can't read the ppid from ps, should be the first item in the table"); + let command = parts + .next() + .expect("Can't read the command from ps, should be the first item in the table"); + + Ok(ProcessInfo { + parent_pid: u32::from_str_radix(ppid, 10).ok(), + command: command.into(), + }) +} + +#[cfg(all(test, unix))] +mod tests { + use super::*; + use pretty_assertions::assert_eq; + use std::process::{Command, Stdio}; + + #[test] + fn test_get_process_info() { + let subprocess = Command::new("bash") + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .expect("Can't execute command"); + let process_info = get_process_info(subprocess.id()); + let parent_pid = process_info.ok().and_then(|x| x.parent_pid); + assert_eq!(parent_pid, Some(std::process::id())); + } +} diff --git a/src/shell/infer/windows.rs b/src/shell/infer/windows.rs new file mode 100644 index 0000000..17ea46d --- /dev/null +++ b/src/shell/infer/windows.rs @@ -0,0 +1,84 @@ +#![cfg(windows)] + +use super::super::{Bash, PowerShell, Shell, WindowsCmd}; +use serde::Deserialize; +use std::collections::HashMap; + +#[derive(Deserialize, Debug)] +pub struct ProcessInfo { + #[serde(rename = "ExecutablePath")] + executable_path: Option, + #[serde(rename = "ParentProcessId")] + parent_pid: u32, + #[serde(rename = "ProcessId")] + pid: u32, +} + +pub fn infer_shell() -> Option> { + let process_map = get_process_map().ok()?; + let process_tree = get_process_tree(process_map, std::process::id()); + + for process in process_tree { + if let Some(exec_path) = process.executable_path { + match exec_path.file_name().and_then(|x| x.to_str()) { + Some("cmd.exe") => { + return Some(Box::from(WindowsCmd)); + } + Some("bash.exe") => { + return Some(Box::from(Bash)); + } + Some("powershell.exe") | Some("pwsh.exe") => { + return Some(Box::from(PowerShell)); + } + _ => {} + } + } + } + + None +} + +type ProcessMap = HashMap; + +pub fn get_process_tree(mut process_map: ProcessMap, pid: u32) -> Vec { + let mut vec = vec![]; + let mut current = process_map.remove(&pid); + + while let Some(process) = current { + current = process_map.remove(&process.parent_pid); + vec.push(process); + } + + vec +} + +pub fn get_process_map() -> std::io::Result { + let stdout = std::process::Command::new("wmic") + .args(&[ + "process", + "get", + "processid,parentprocessid,executablepath", + "/format:csv", + ]) + .stdout(std::process::Stdio::piped()) + .spawn()? + .stdout + .ok_or(std::io::Error::from(std::io::ErrorKind::UnexpectedEof))?; + + let mut reader = csv::Reader::from_reader(stdout); + let hashmap: HashMap<_, _> = reader + .deserialize::() + .filter_map(Result::ok) + .map(|x| (x.pid, x)) + .collect(); + Ok(hashmap) +} + +#[cfg(test)] +mod tests { + #[test] + fn test_me() { + let processes = super::get_process_map().unwrap(); + assert!(processes.contains_key(&std::process::id())); + } +} diff --git a/src/shell/mod.rs b/src/shell/mod.rs new file mode 100644 index 0000000..3cc35a1 --- /dev/null +++ b/src/shell/mod.rs @@ -0,0 +1,29 @@ +mod bash; +mod fish; +mod infer; +mod powershell; +mod windows_cmd; +mod zsh; + +#[allow(clippy::module_inception)] +mod shell; + +pub use bash::Bash; +pub use fish::Fish; +pub use powershell::PowerShell; +pub use shell::{Shell, AVAILABLE_SHELLS}; +pub use windows_cmd::WindowsCmd; +pub use zsh::Zsh; + +/// Always returns WindowsCmd (because this is what we support on Windows) +#[cfg(windows)] +pub fn infer_shell() -> Box { + let inferred = self::infer::windows::infer_shell(); + inferred.expect("Can't infer shell") +} + +/// Tries to infer shell or dies trying +#[cfg(unix)] +pub fn infer_shell() -> Box { + infer::unix::infer_shell().expect("Can't infer shell") +} diff --git a/src/shell/powershell.rs b/src/shell/powershell.rs new file mode 100644 index 0000000..e451112 --- /dev/null +++ b/src/shell/powershell.rs @@ -0,0 +1,31 @@ +use super::Shell; +use indoc::indoc; + +#[derive(Debug)] +pub struct PowerShell; + +impl Shell for PowerShell { + fn path(&self, path: &std::path::PathBuf) -> String { + let current_path = std::env::var_os("PATH").expect("Can't read PATH env var"); + let mut split_paths: Vec<_> = std::env::split_paths(¤t_path).collect(); + split_paths.insert(0, path.to_path_buf()); + let new_path = std::env::join_paths(split_paths).expect("Can't join paths"); + self.set_env_var("PATH", new_path.to_str().expect("Can't read PATH")) + } + + fn set_env_var(&self, name: &str, value: &str) -> String { + format!(r#"$env:{} = "{}""#, name, value) + } + + fn use_on_cd(&self, _config: &crate::config::FnmConfig) -> String { + indoc!(r#" + function Set-LocationWithFnm { param($path); Set-Location $path; If ((Test-Path .nvmrc) -Or (Test-Path .node-version)) { & fnm use } } + Set-Alias cd_with_fnm Set-LocationWithFnm -Force + Remove-Item alias:\cd + New-Alias cd Set-LocationWithFnm + "#).into() + } + fn into_structopt_shell(&self) -> clap::Shell { + clap::Shell::PowerShell + } +} diff --git a/src/shell/shell.rs b/src/shell/shell.rs new file mode 100644 index 0000000..7239e5f --- /dev/null +++ b/src/shell/shell.rs @@ -0,0 +1,36 @@ +use std::fmt::Debug; +use std::path::PathBuf; + +pub trait Shell: Debug { + fn path(&self, path: &PathBuf) -> String; + fn set_env_var(&self, name: &str, value: &str) -> String; + fn use_on_cd(&self, config: &crate::config::FnmConfig) -> String; + fn into_structopt_shell(&self) -> structopt::clap::Shell; +} + +#[cfg(windows)] +pub const AVAILABLE_SHELLS: &[&str; 5] = &["cmd", "powershell", "bash", "zsh", "fish"]; + +#[cfg(unix)] +pub const AVAILABLE_SHELLS: &[&str; 4] = &["bash", "zsh", "fish", "powershell"]; + +impl std::str::FromStr for Box { + type Err = String; + + fn from_str(s: &str) -> Result, Self::Err> { + match s { + "cmd" => Ok(Box::from(super::windows_cmd::WindowsCmd)), + "zsh" => Ok(Box::from(super::zsh::Zsh)), + "bash" => Ok(Box::from(super::bash::Bash)), + "fish" => Ok(Box::from(super::fish::Fish)), + "powershell" => Ok(Box::from(super::powershell::PowerShell)), + shell_type => Err(format!("I don't know the shell type of {:?}", shell_type)), + } + } +} + +impl Into for Box { + fn into(self) -> structopt::clap::Shell { + self.into_structopt_shell() + } +} diff --git a/src/shell/windows_cmd/cd.cmd b/src/shell/windows_cmd/cd.cmd new file mode 100644 index 0000000..a49c3a7 --- /dev/null +++ b/src/shell/windows_cmd/cd.cmd @@ -0,0 +1,10 @@ +@echo off +cd %1 +if exist .nvmrc ( + fnm use +) else ( + if exist .node-version ( + fnm use + ) +) +@echo on \ No newline at end of file diff --git a/src/shell/windows_cmd/mod.rs b/src/shell/windows_cmd/mod.rs new file mode 100644 index 0000000..af60d71 --- /dev/null +++ b/src/shell/windows_cmd/mod.rs @@ -0,0 +1,40 @@ +use super::shell::Shell; +use std::path::PathBuf; + +#[derive(Debug)] +pub struct WindowsCmd; + +impl Shell for WindowsCmd { + fn into_structopt_shell(&self) -> structopt::clap::Shell { + panic!("Shell completion is not supported for Windows Command Prompt. Maybe try using PowerShell for a better experience?"); + } + + fn path(&self, path: &PathBuf) -> String { + let current_path = std::env::var_os("path").expect("Can't read PATH env var"); + let mut split_paths: Vec<_> = std::env::split_paths(¤t_path).collect(); + split_paths.insert(0, path.to_path_buf()); + let new_path = std::env::join_paths(split_paths).expect("Can't join paths"); + format!("SET PATH={}", new_path.to_str().expect("Can't read PATH")) + } + + fn set_env_var(&self, name: &str, value: &str) -> String { + format!("SET {}={}", name, value) + } + + fn use_on_cd(&self, config: &crate::config::FnmConfig) -> String { + let path = config.base_dir_with_default().join("cd.cmd"); + create_cd_file_at(&path).expect("Can't create cd.cmd file for use-on-cd"); + format!( + "doskey cd={} $1", + path.to_str().expect("Can't read path to cd.cmd") + ) + } +} + +fn create_cd_file_at(path: &std::path::Path) -> std::io::Result<()> { + use std::io::Write; + let cmd_contents = include_bytes!("./cd.cmd"); + let mut file = std::fs::File::create(path)?; + file.write_all(cmd_contents)?; + Ok(()) +} diff --git a/src/shell/zsh.rs b/src/shell/zsh.rs new file mode 100644 index 0000000..91c32d7 --- /dev/null +++ b/src/shell/zsh.rs @@ -0,0 +1,41 @@ +use super::shell::Shell; +use indoc::indoc; +use std::path::PathBuf; + +#[derive(Debug)] +pub struct Zsh; + +impl Shell for Zsh { + fn into_structopt_shell(&self) -> structopt::clap::Shell { + structopt::clap::Shell::Zsh + } + + fn path(&self, path: &PathBuf) -> String { + format!("export PATH={:?}:$PATH", path.to_str().unwrap()) + } + + fn set_env_var(&self, name: &str, value: &str) -> String { + format!("export {}={:?}", name, value) + } + + fn use_on_cd(&self, _config: &crate::config::FnmConfig) -> String { + indoc!( + r#" + autoload -U add-zsh-hook + _fnm_autoload_hook () { + if [[ -f .node-version && -r .node-version ]]; then + echo "fnm: Found .node-version" + fnm use + elif [[ -f .nvmrc && -r .nvmrc ]]; then + echo "fnm: Found .nvmrc" + fnm use + fi + } + + add-zsh-hook chpwd _fnm_autoload_hook \ + && _fnm_autoload_hook + "# + ) + .into() + } +} diff --git a/src/system_info.rs b/src/system_info.rs new file mode 100644 index 0000000..e93e33c --- /dev/null +++ b/src/system_info.rs @@ -0,0 +1,19 @@ +#[cfg(target_os = "macos")] +pub fn platform_name() -> &'static str { + "darwin" +} + +#[cfg(target_os = "linux")] +pub fn platform_name() -> &'static str { + "linux" +} + +#[cfg(target_pointer_width = "32")] +pub fn platform_arch() -> &'static str { + "x86" +} + +#[cfg(target_pointer_width = "64")] +pub fn platform_arch() -> &'static str { + "x64" +} diff --git a/src/system_version.rs b/src/system_version.rs new file mode 100644 index 0000000..bb74bc0 --- /dev/null +++ b/src/system_version.rs @@ -0,0 +1,11 @@ +use std::path::PathBuf; + +pub fn path() -> PathBuf { + let path_as_string = if cfg!(windows) { + "Z:/_fnm_/Nothing/Should/Be/Here/installation" + } else { + "/dev/null/installation" + }; + + PathBuf::from(path_as_string) +} diff --git a/src/user_version.rs b/src/user_version.rs new file mode 100644 index 0000000..74f234c --- /dev/null +++ b/src/user_version.rs @@ -0,0 +1,119 @@ +use crate::version::Version; + +#[derive(Clone, Debug)] +pub enum UserVersion { + OnlyMajor(u64), + MajorMinor(u64, u64), + Full(Version), +} + +impl UserVersion { + pub fn to_version<'a, T>(&self, available_versions: T) -> Option<&'a Version> + where + T: IntoIterator, + { + available_versions.into_iter().filter(|x| &self == x).max() + } + + pub fn alias_name(&self) -> Option { + match self { + Self::Full(version) => version.alias_name(), + _ => None, + } + } +} + +impl PartialEq for UserVersion { + fn eq(&self, other: &Version) -> bool { + match (self, other) { + (Self::Full(a), b) if a == b => true, + (Self::Full(_), _) => false, + (_, Version::Bypassed) => false, + (_, Version::Lts(_)) => false, + (_, Version::Alias(_)) => false, + (Self::OnlyMajor(major), Version::Semver(other)) => *major == other.major, + (Self::MajorMinor(major, minor), Version::Semver(other)) => { + *major == other.major && *minor == other.minor + } + } + } +} + +fn next_of<'a, T: std::str::FromStr, It: Iterator>(i: &mut It) -> Option { + let x = i.next()?; + T::from_str(x).ok() +} + +impl std::fmt::Display for UserVersion { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Full(x) => x.fmt(f), + Self::OnlyMajor(major) => write!(f, "v{}.x.x", major), + Self::MajorMinor(major, minor) => write!(f, "v{}.{}.x", major, minor), + } + } +} + +impl std::str::FromStr for UserVersion { + type Err = semver::SemVerError; + fn from_str(s: &str) -> Result { + match Version::parse(s) { + Ok(v) => Ok(Self::Full(v)), + Err(e) => { + let mut parts = s.trim().split('.'); + match (next_of::(&mut parts), next_of::(&mut parts)) { + (Some(major), None) => Ok(Self::OnlyMajor(major)), + (Some(major), Some(minor)) => Ok(Self::MajorMinor(major, minor)), + _ => Err(e), + } + } + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_major_to_version() { + let expected = Version::parse("6.1.0").unwrap(); + let versions = vec![ + Version::parse("6.0.0").unwrap(), + Version::parse("6.0.1").unwrap(), + expected.clone(), + Version::parse("7.0.1").unwrap(), + ]; + let result = UserVersion::OnlyMajor(6).to_version(&versions); + + assert_eq!(result, Some(&expected)); + } + + #[test] + fn test_major_minor_to_version() { + let expected = Version::parse("6.0.1").unwrap(); + let versions = vec![ + Version::parse("6.0.0").unwrap(), + Version::parse("6.1.0").unwrap(), + expected.clone(), + Version::parse("7.0.1").unwrap(), + ]; + let result = UserVersion::MajorMinor(6, 0).to_version(&versions); + + assert_eq!(result, Some(&expected)); + } + + #[test] + fn test_semver_to_version() { + let expected = Version::parse("6.0.0").unwrap(); + let versions = vec![ + expected.clone(), + Version::parse("6.1.0").unwrap(), + Version::parse("6.0.1").unwrap(), + Version::parse("7.0.1").unwrap(), + ]; + let result = UserVersion::Full(expected.clone()).to_version(&versions); + + assert_eq!(result, Some(&expected)); + } +} diff --git a/src/version.rs b/src/version.rs new file mode 100644 index 0000000..6a6d1b6 --- /dev/null +++ b/src/version.rs @@ -0,0 +1,99 @@ +use crate::lts::LtsType; +use std::str::FromStr; + +#[derive(Debug, PartialEq, PartialOrd, Eq, Ord, Clone)] +pub enum Version { + Semver(semver::Version), + Lts(LtsType), + Alias(String), + Bypassed, +} + +fn first_letter_is_number(s: &str) -> bool { + s.chars().next().map(|x| x.is_digit(10)).unwrap_or(false) +} + +impl Version { + pub fn parse>(version_str: S) -> Result { + let lowercased = version_str.as_ref().to_lowercase(); + if lowercased == "system" { + Ok(Self::Bypassed) + } else if lowercased.starts_with("lts-") || lowercased.starts_with("lts/") { + let lts_type = LtsType::from(&lowercased[4..]); + Ok(Self::Lts(lts_type)) + } else if first_letter_is_number(lowercased.trim_start_matches('v')) { + let version_plain = lowercased.trim_start_matches('v'); + let sver = semver::Version::parse(&version_plain)?; + Ok(Self::Semver(sver)) + } else { + Ok(Self::Alias(lowercased)) + } + } + + pub fn alias_name(&self) -> Option { + match self { + l @ Self::Lts(_) => Some(l.v_str()), + l @ Self::Alias(_) => Some(l.v_str()), + _ => None, + } + } + + pub fn v_str(&self) -> String { + format!("{}", self) + } + + pub fn installation_path( + &self, + config: &crate::config::FnmConfig, + ) -> Option { + match self { + Self::Bypassed => None, + v @ Self::Lts(_) | v @ Self::Alias(_) => { + Some(config.aliases_dir().join(v.alias_name().unwrap())) + } + v @ Self::Semver(_) => Some( + config + .installations_dir() + .join(v.v_str()) + .join("installation"), + ), + } + } +} + +impl<'de> serde::Deserialize<'de> for Version { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let version_str = String::deserialize(deserializer)?; + Version::parse(version_str).map_err(serde::de::Error::custom) + } +} + +impl std::fmt::Display for Version { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Bypassed => write!(f, "system"), + Self::Lts(lts) => write!(f, "lts-{}", lts), + Self::Semver(semver) => write!(f, "v{}", semver), + Self::Alias(alias) => write!(f, "{}", alias), + } + } +} + +impl FromStr for Version { + type Err = semver::SemVerError; + fn from_str(s: &str) -> Result { + Self::parse(s) + } +} + +impl PartialEq for Version { + fn eq(&self, other: &semver::Version) -> bool { + match self { + Self::Bypassed | Self::Lts(_) | Self::Alias(_) => false, + Self::Semver(v) => v == other, + } + } +} diff --git a/src/version_files.rs b/src/version_files.rs new file mode 100644 index 0000000..e951e6f --- /dev/null +++ b/src/version_files.rs @@ -0,0 +1,40 @@ +use crate::user_version::UserVersion; +use encoding_rs_io::DecodeReaderBytes; +use log::info; +use std::io::Read; +use std::path::Path; +use std::str::FromStr; + +const PATH_PARTS: [&str; 2] = [".nvmrc", ".node-version"]; + +pub fn get_user_version_from_file(path: impl AsRef) -> Option { + let path = path.as_ref(); + + for path_part in PATH_PARTS.iter() { + let new_path = path.join(path_part); + info!( + "Looking for version file in {}. exists? {}", + new_path.display(), + new_path.exists() + ); + if let Ok(file) = std::fs::File::open(new_path) { + let version = { + let mut reader = DecodeReaderBytes::new(file); + let mut version = String::new(); + reader.read_to_string(&mut version).map(|_| version) + }; + + match version { + Err(err) => info!("Can't read file: {}", err), + Ok(version) => { + info!("Found string {:?} in version file", version); + if let Ok(ver) = UserVersion::from_str(version.trim()) { + return Some(ver); + } + } + } + } + } + + None +} diff --git a/test/SmokeTest.re b/test/SmokeTest.re deleted file mode 100644 index 3d8b287..0000000 --- a/test/SmokeTest.re +++ /dev/null @@ -1,17 +0,0 @@ -open TestFramework; - -describe("Smoke test", ({test, _}) => { - test("Tests run!", ({expect}) => - expect.int(1).toBe(1) - ); - - test("Get version", ({expect}) => { - let version = run([|"--version"|]); - expect.string(version |> String.trim).toMatch("^\\d+.\\d+.\\d+$"); - }); - - test("env", ({expect}) => { - let env = run([|"env", "--shell=bash"|]) |> redactSfwRoot; - expect.string(env).toMatchSnapshot(); - }); -}); diff --git a/test/TestFnm.re b/test/TestFnm.re deleted file mode 100644 index f98c173..0000000 --- a/test/TestFnm.re +++ /dev/null @@ -1,7 +0,0 @@ -include SmokeTest; -include TestSemver; -include TestFs; -include TestUninstall; -include TestListRemote; - -TestFramework.cli(); diff --git a/test/TestFramework.re b/test/TestFramework.re deleted file mode 100644 index a5b6078..0000000 --- a/test/TestFramework.re +++ /dev/null @@ -1,37 +0,0 @@ -let projectDir = Sys.getcwd(); -let tmpDir = Filename.concat(projectDir, ".fnmTmp"); - -include Rely.Make({ - let config = - Rely.TestFrameworkConfig.initialize({ - snapshotDir: - Filename.concat( - projectDir, - Filename.concat("test", "__snapshots__"), - ), - projectDir, - }); -}); - -let run = args => { - let arguments = - args - |> Array.append([|"./_esy/default/build/default/executable/FnmApp.exe"|]); - let env = - Unix.environment() - |> Array.append([| - Printf.sprintf("%s=%s", Fnm.Config.FNM_DIR.name, tmpDir), - "FORCE_COLOR=false", - |]); - let result = - Lwt_process.pread_chars(~env, ("", arguments)) |> Lwt_stream.to_string; - Lwt_main.run(result); -}; - -let clearTmpDir = () => { - let _ = Lwt_process.pread(("", [|"rm", "-rf", tmpDir|])) |> Lwt_main.run; - (); -}; - -let redactSfwRoot = - Str.global_replace(Str.regexp_string(tmpDir), ""); diff --git a/test/TestFs.re b/test/TestFs.re deleted file mode 100644 index b292071..0000000 --- a/test/TestFs.re +++ /dev/null @@ -1,61 +0,0 @@ -open TestFramework; -open Fnm; - -let get_tempdir = prefix => { - Printf.sprintf( - "fnm-test-%s-%s", - prefix, - Unix.time() |> int_of_float |> string_of_int, - ) - |> Filename.concat(Filename.get_temp_dir_name()); -}; - -describe("TestSemver", ({test, describe, _}) => { - describe("listDirRecursively", ({test, _}) => { - test("list files and directories", ({expect, _}) => { - let xs = Fs.listDirRecursively("feature_tests") |> Lwt_main.run; - expect.list(xs).toContainEqual( - Fs.File("feature_tests/multishell/run.sh"), - ); - expect.list(xs).toContainEqual(Fs.Dir("feature_tests/multishell")); - expect.list(xs).toContainEqual(Fs.Dir("feature_tests")); - }); - - test("works with symlinks", ({expect, _}) => { - let tmpdir = get_tempdir("symlinks"); - let fileDir = Filename.concat(tmpdir, "a/b/c/d/e/f/g"); - let filePath = Filename.concat(fileDir, "file"); - Sys.command("mkdir -p " ++ fileDir) |> ignore; - Sys.command("touch " ++ filePath) |> ignore; - Sys.command("ln -s " ++ filePath ++ " " ++ filePath ++ "_link") - |> ignore; - Sys.command( - "ln -s " ++ filePath ++ "_not_found " ++ filePath ++ "_link_not_found", - ) - |> ignore; - - let xs = Fs.listDirRecursively(tmpdir) |> Lwt_main.run; - expect.list(xs).toContainEqual(Fs.File(filePath ++ "_link")); - expect.list(xs).toContainEqual( - Fs.File(filePath ++ "_link_not_found"), - ); - expect.list(xs).toContainEqual(Fs.File(filePath)); - expect.list(xs).toContainEqual(Fs.Dir(fileDir)); - }); - }); - - test("rmdir", ({expect, _}) => { - let tmpdir = get_tempdir("rmdir"); - let fileDir = Filename.concat(tmpdir, "a/b/c/d/e/f/g"); - let filePath = Filename.concat(fileDir, "file"); - - Sys.command("mkdir -p " ++ fileDir) |> ignore; - Sys.command("touch " ++ filePath) |> ignore; - Unix.symlink(filePath, filePath ++ "_link"); - Fs.rmdir(tmpdir) |> Lwt_main.run; - - let remainingFiles = Fs.listDirRecursively(tmpdir) |> Lwt_main.run; - - expect.list(remainingFiles).toBeEmpty(); - }); -}); diff --git a/test/TestListRemote.re b/test/TestListRemote.re deleted file mode 100644 index b1f9cda..0000000 --- a/test/TestListRemote.re +++ /dev/null @@ -1,116 +0,0 @@ -open TestFramework; - -let allVersions6 = [ - "v6.0.0", - "v6.1.0", - "v6.2.0", - "v6.2.1", - "v6.2.2", - "v6.3.0", - "v6.3.1", - "v6.4.0", - "v6.5.0", - "v6.6.0", - "v6.7.0", - "v6.8.0", - "v6.8.1", - "v6.9.0", - "v6.9.1", - "v6.9.2", - "v6.9.3", - "v6.9.4", - "v6.9.5", - "v6.10.0", - "v6.10.1", - "v6.10.2", - "v6.10.3", - "v6.11.0", - "v6.11.1", - "v6.11.2", - "v6.11.3", - "v6.11.4", - "v6.11.5", - "v6.12.0", - "v6.12.1", - "v6.12.2", - "v6.12.3", - "v6.13.0", - "v6.13.1", - "v6.14.0", - "v6.14.1", - "v6.14.2", - "v6.14.3", - "v6.14.4", - "v6.15.0", - "v6.15.1", - "v6.16.0", - "v6.17.0", - "v6.17.1", -]; - -let allVersions6_11 = [ - "v6.11.0", - "v6.11.1", - "v6.11.2", - "v6.11.3", - "v6.11.4", - "v6.11.5", -]; - -describe("List Remote", ({test, _}) => { - let versionRegExp = Str.regexp(".*[0-9]+\\.[0-9]+\\.[0-9]+\\|.*latest-*"); - - let filterVersionNumbers = response => - response - |> String.split_on_char('\n') - |> List.filter(s => Str.string_match(versionRegExp, s, 0)) - |> List.map(s => Str.replace_first(Str.regexp("\\*"), "", s)) - |> List.map(String.trim); - - let runAndFilterVersionNumbers = args => run(args) |> filterVersionNumbers; - - test("Should display remote versions matching a major version", ({expect}) => { - let versionNumbers = runAndFilterVersionNumbers([|"ls-remote", "6"|]); - - expect.lines(versionNumbers).toEqualLines(allVersions6); - }); - test( - "Should display remote versions matching a major and minor version", - ({expect}) => { - let versionNumbers = runAndFilterVersionNumbers([|"ls-remote", "6.11"|]); - - expect.lines(versionNumbers).toEqualLines(allVersions6_11); - }); - test( - "Should display remote version matching a specific version", ({expect}) => { - let versionNumbers = - runAndFilterVersionNumbers([|"ls-remote", "6.11.3"|]); - - expect.int(versionNumbers |> List.length).toBe(1); - expect.lines(versionNumbers).toEqual("v6.11.3"); - }); - test("Should display latest remote version", ({expect}) => { - let versionNumbers = - runAndFilterVersionNumbers([|"ls-remote", "latest"|]); - - expect.int(versionNumbers |> List.length).toBe(1); - expect.lines(versionNumbers).toEqual("latest"); - }); - - test("Should display latest specific remote version", ({expect}) => { - let versionNumbers = - runAndFilterVersionNumbers([|"ls-remote", "latest-v6"|]); - - expect.int(versionNumbers |> List.length).toBe(1); - expect.lines(versionNumbers).toEqual("latest-v6.x"); - }); - test( - "Should display an error message if version does not exist", ({expect}) => { - let result = run([|"ls-remote", "190385"|]); - - let versionNumbers = result |> filterVersionNumbers; - - expect.int(versionNumbers |> List.length).toBe(0); - expect.string(result).toMatch(".*No versions found.*"); - }); -}); diff --git a/test/TestSemver.re b/test/TestSemver.re deleted file mode 100644 index 8f39c6a..0000000 --- a/test/TestSemver.re +++ /dev/null @@ -1,27 +0,0 @@ -open TestFramework; - -describe("Semver", ({test, _}) => { - open Fnm; - - test("parses a string", ({expect, _}) => { - let x = Semver.fromString("1.2.3"); - expect.equal(x, Some(Semver.make(~major=1, ~minor=2, ~patch=3))); - }); - - test("returns none on invalid semver", ({expect, _}) => { - let x = Semver.fromString("x1.2.3"); - expect.equal(x, None); - }); - - test("compare versions", ({expect}) => { - let semver1 = Semver.make(~major=1, ~minor=2, ~patch=0); - let semver2 = Semver.make(~major=1, ~minor=2, ~patch=3); - let semver3 = Semver.make(~major=1, ~minor=3, ~patch=3); - let semver4 = Semver.make(~major=4, ~minor=3, ~patch=3); - - let sorted = - List.sort(Semver.compare, [semver1, semver2, semver4, semver3]); - - expect.list(sorted).toEqual([semver1, semver2, semver3, semver4]); - }); -}); diff --git a/test/TestUninstall.re b/test/TestUninstall.re deleted file mode 100644 index 85eeb1b..0000000 --- a/test/TestUninstall.re +++ /dev/null @@ -1,54 +0,0 @@ -open TestFramework; - -let installVersion = version => run([|"install", version|]); -let uninstallVersion = version => run([|"uninstall", version|]); - -let isVersionInstalled = version => - run([|"ls"|]) - |> String.split_on_char('\n') - |> List.exists(v => v == "* v" ++ version); - -describe("Uninstall", ({test, _}) => { - test("Should be possible to uninstall a specific version", ({expect, _}) => { - let version = "6.0.0"; - let _ = installVersion(version); - let response = uninstallVersion(version); - expect.string(response).toMatch( - ".*v" ++ version ++ ".* has correctly been removed.*", - ); - expect.bool(isVersionInstalled(version)).toBeFalse(); - }); - test( - "Should print out a message if multiple versions match the prefix", - ({expect, _}) => { - let v1 = "6.10.0"; - let v2 = "6.11.0"; - let _ = installVersion(v1); - let _ = installVersion(v2); - let response = - uninstallVersion("6") - |> String.split_on_char('\n') - |> String.concat(" "); - expect.string(response).toMatch("multiple versions"); - expect.string(response).toMatch(" v" ++ v1 ++ " "); - expect.string(response).toMatch(" v" ++ v2 ++ " "); - expect.bool(isVersionInstalled(v1)).toBeTrue(); - expect.bool(isVersionInstalled(v2)).toBeTrue(); - clearTmpDir(); - }); - test( - "Should be able to uninstall with a prefix if only one version match", - ({expect, _}) => { - let v1 = "6.10.0"; - let v2 = "6.11.0"; - let _ = installVersion(v1); - let _ = installVersion(v2); - let response = uninstallVersion("6.10"); - expect.string(response).toMatch( - ".*v" ++ v1 ++ ".* has correctly been removed.*", - ); - expect.bool(isVersionInstalled(v1)).toBeFalse(); - expect.bool(isVersionInstalled(v2)).toBeTrue(); - clearTmpDir(); - }); -}); diff --git a/test/__snapshots__/Smoke_test.4d362c3c.0.snapshot b/test/__snapshots__/Smoke_test.4d362c3c.0.snapshot deleted file mode 100644 index 7f88166..0000000 --- a/test/__snapshots__/Smoke_test.4d362c3c.0.snapshot +++ /dev/null @@ -1,7 +0,0 @@ -Smoke test › env -export PATH=/current/bin:$PATH -export FNM_MULTISHELL_PATH=/current -export FNM_DIR=/ -export FNM_NODE_DIST_MIRROR=https://nodejs.org/dist -export FNM_LOGLEVEL=info - diff --git a/test/dune b/test/dune deleted file mode 100644 index a209695..0000000 --- a/test/dune +++ /dev/null @@ -1,12 +0,0 @@ - -; !!!! This dune file is generated from the package.json file by pesy. If you modify it by hand -; !!!! your changes will be undone! Instead, edit the package.json and then rerun 'esy pesy' at the project root. -; !!!! If you want to stop using pesy and manage this file by hand, change package.json's 'esy.build' command to: refmterr dune build -p fnm -(executable - ; The entrypoint module - (name TestFnm) ; From package.json main field - ; The name of the executable (runnable via esy x TestFnm.exe) - (public_name TestFnm.exe) ; From package.json name field - (libraries fnm.lib rely.lib ) ; From package.json require field (array of strings) - (ocamlopt_flags ( -linkall -g )) ; From package.json ocamloptFlags field -) \ No newline at end of file diff --git a/tests/e2e.rs b/tests/e2e.rs new file mode 100644 index 0000000..e36dc9f --- /dev/null +++ b/tests/e2e.rs @@ -0,0 +1,4 @@ +#[macro_use] +mod shellcode; + +mod feature_tests; diff --git a/tests/feature_tests/aliases.rs b/tests/feature_tests/aliases.rs new file mode 100644 index 0000000..355832d --- /dev/null +++ b/tests/feature_tests/aliases.rs @@ -0,0 +1,28 @@ +use crate::shellcode::*; + +fn installed_versions() -> Call { + Call::new("fnm", vec!["ls"]) +} + +test_shell!(Bash, Zsh, Fish, PowerShell; { + EvalFnmEnv::default() + .then(Call::new("fnm", vec!["install", "6.11.3"])) + .then(Call::new("fnm", vec!["install", "8.11.3"])) + .then(Call::new("fnm", vec!["alias", "8.11", "oldie"])) + .then(Call::new("fnm", vec!["alias", "6", "older"])) + .then(Call::new("fnm", vec!["default", "older"])) + .then(OutputContains::new( + OutputContains::new(installed_versions(), "8.11.3"), + "oldie", + )) + .then(OutputContains::new( + OutputContains::new(OutputContains::new(installed_versions(), "6.11.3"), "older"), + "default", + )) + .then(Call::new("fnm", vec!["use", "older"])) + .then(test_node_version("v6.11.3")) + .then(Call::new("fnm", vec!["use", "oldie"])) + .then(test_node_version("v8.11.3")) + .then(Call::new("fnm", vec!["use", "default"])) + .then(test_node_version("v6.11.3")) +}); diff --git a/tests/feature_tests/current.rs b/tests/feature_tests/current.rs new file mode 100644 index 0000000..88085ad --- /dev/null +++ b/tests/feature_tests/current.rs @@ -0,0 +1,28 @@ +test_shell!(Bash, Zsh, Fish, PowerShell, WinCmd; { + EvalFnmEnv::default() + .then(ExpectCommandOutput::new( + Call::new("fnm", vec!["current"]), + "none", + "currently activated version", + )) + .then(Call::new("fnm", vec!["install", "v8.11.3"])) + .then(Call::new("fnm", vec!["install", "v10.10.0"])) + .then(Call::new("fnm", vec!["use", "v8.11.3"])) + .then(ExpectCommandOutput::new( + Call::new("fnm", vec!["current"]), + "v8.11.3", + "currently activated version", + )) + .then(Call::new("fnm", vec!["use", "v10.10.0"])) + .then(ExpectCommandOutput::new( + Call::new("fnm", vec!["current"]), + "v10.10.0", + "currently activated version", + )) + .then(Call::new("fnm", vec!["use", "system"])) + .then(ExpectCommandOutput::new( + Call::new("fnm", vec!["current"]), + "system", + "currently activated version", + )) +}); diff --git a/tests/feature_tests/mod.rs b/tests/feature_tests/mod.rs new file mode 100644 index 0000000..577216f --- /dev/null +++ b/tests/feature_tests/mod.rs @@ -0,0 +1,201 @@ +mod aliases; +mod current; + +use crate::shellcode::*; + +mod basic { + test_shell!(Zsh, Bash, Fish, PowerShell, WinCmd; { + EvalFnmEnv::default() + .then(Call::new("fnm", vec!["install", "v8.11.3"])) + .then(Call::new("fnm", vec!["use", "v8.11.3"])) + .then(test_node_version("v8.11.3")) + }); +} + +mod nvmrc { + test_shell!(Zsh, Bash, Fish, PowerShell, WinCmd; { + EvalFnmEnv::default() + .then(WriteFile::new(".nvmrc", "v8.11.3")) + .then(Call::new("fnm", vec!["install"])) + .then(Call::new("fnm", vec!["use"])) + .then(test_node_version("v8.11.3")) + }); +} + +mod multishell { + test_shell!(Zsh, Bash, Fish, PowerShell; { + EvalFnmEnv::default() + .then(Call::new("fnm", vec!["install", "v8.11.3"])) + .then(Call::new("fnm", vec!["install", "v11.9.0"])) + .then(Call::new("fnm", vec!["use", "v8.11.3"])) + .then(SubShell::new( + DieOnErrors + .then(EvalFnmEnv::default()) + .then(Call::new("fnm", vec!["use", "11"])) + .then(test_node_version("v11.9.0")), + )) + .then(test_node_version("v8.11.3")) + }); +} + +mod use_on_cd_nvmrc { + test_shell!(Zsh, Bash, Fish, PowerShell; { + EvalFnmEnv::default() + .use_on_cd(true) + .then(Call::new("mkdir", vec!["inner_path"])) + .then(WriteFile::new("inner_path/.nvmrc", "v8.11.3")) + .then(Call::new("fnm", vec!["install", "v8.11.3"])) + .then(Call::new("cd", vec!["inner_path"])) + .then(test_node_version("v8.11.3")) + }); +} + +mod use_on_cd_dot_node_version { + test_shell!(Zsh, Bash, Fish, PowerShell; { + EvalFnmEnv::default() + .use_on_cd(true) + .then(Call::new("mkdir", vec!["inner_path"])) + .then(WriteFile::new("inner_path/.node-version", "v8.11.3")) + .then(Call::new("fnm", vec!["install", "v8.11.3"])) + .then(Call::new("cd", vec!["inner_path"])) + .then(test_node_version("v8.11.3")) + }); +} + +// mod node_dist_mirror { +// test_shell!(Zsh, Bash, Fish, PowerShell, { +// EvalFnmEnv::default() +// .node_dist_mirror(Some("https://npm.taobao.org/mirrors/node")) +// .then(Call::new("fnm", vec!["install", "v8.11.3"])) +// .then(Call::new("fnm", vec!["use", "v8.11.3"])) +// .then(test_node_version("v8.11.3")) +// }); +// } + +mod exec { + test_shell!(Zsh, Bash, Fish, PowerShell, WinCmd; { + EvalFnmEnv::default() + .then(WriteFile::new(".nvmrc", "v8.10.0")) + .then(Call::new("fnm", vec!["install"])) + .then(Call::new("fnm", vec!["install", "v6.10.0"])) + .then(Call::new("fnm", vec!["install", "v10.10.0"])) + .then(ExpectCommandOutput::new( + Call::new("fnm", vec!["exec", "--", "node", "-v"]), + "v8.10.0", + "version file exec", + )) + .then(ExpectCommandOutput::new( + Call::new("fnm", vec!["exec", "--using=6", "--", "node", "-v"]), + "v6.10.0", + "exec:6 node -v", + )) + .then(ExpectCommandOutput::new( + Call::new("fnm", vec!["exec", "--using=10", "--", "node", "-v"]), + "v10.10.0", + "exec:6 node -v", + )) + }); +} + +mod existing_installation { + test_shell!(Bash, Zsh, Fish, PowerShell; { + EvalFnmEnv::default() + .then(Call::new("fnm", vec!["install", "v8.11.3"])) + .then(OutputContains::new( + IgnoreErrors::new(GetStderr::new(Call::new("fnm", vec!["install", "v8.11.3"]))), + "already installed", + )) + }); +} + +mod system_node { + test_shell!(Bash, Zsh, Fish, PowerShell; |path: &std::path::Path| { + use std::io::Write; + let custom_node_dir = path.join("bin"); + std::fs::create_dir(&custom_node_dir).unwrap(); + std::fs::write(custom_node_dir.join("node.cmd"), b"echo custom node").unwrap(); + let mut f = std::fs::File::create(custom_node_dir.join("node")).unwrap(); + #[cfg(unix)] + { + use std::os::unix::fs::PermissionsExt; + let mut permissions = f.metadata().unwrap().permissions(); + permissions.set_mode(0o766); + f.set_permissions(permissions).expect("Can't set file permissions"); + } + writeln!(f, "#!/bin/sh").expect("Can't write file"); + writeln!(f, r#"echo "custom node""#).expect("Can't write file"); + + EvalFnmEnv::default() + .then(Call::new("fnm", vec!["install", "10"])) + .then(Call::new("fnm", vec!["use", "10"])) + .then(Call::new("fnm", vec!["use", "system"])) + .then(test_node_version("custom node")) + }); +} + +mod use_nvmrc_lts { + test_shell!(Bash, Zsh, Fish, PowerShell; { + EvalFnmEnv::default() + .then(WriteFile::new(".nvmrc", "lts/dubnium")) + .then(Call::new("fnm", vec!["install"])) + .then(Call::new("fnm", vec!["use"])) + .then(OutputContains::new(Call::new("fnm", vec!["ls"]), "lts-dubnium")) + }); +} + +mod partial_semver { + test_shell!(Bash, Zsh, Fish, PowerShell, WinCmd; { + EvalFnmEnv::default() + .then(Call::new("fnm", vec!["install", "6"])) // unsupported version, no new versions should be issued + .then(Call::new("fnm", vec!["use", "6"])) + .then(test_node_version("v6.17.1")) + }); +} + +mod log_level_quiet { + test_shell!(Bash, Zsh, Fish, PowerShell; { + EvalFnmEnv::default() + .log_level(Some("quiet")) + .then(ExpectCommandOutput::new(Call::new("fnm", vec!["install", "v8.11.3"]), "", "fnm install")) + .then(ExpectCommandOutput::new(Call::new("fnm", vec!["use", "v8.11.3"]), "", "fnm use")) + .then(ExpectCommandOutput::new(Call::new("fnm", vec!["alias", "v8.11.3", "something"]), "", "fnm alias")) + }); +} + +mod log_level_error { + test_shell!(Bash, Zsh, Fish, PowerShell; { + EvalFnmEnv::default() + .log_level(Some("error")) + .then(ExpectCommandOutput::new(Call::new("fnm", vec!["install", "v8.11.3"]).then(Call::new("echo", vec!["empty"])), "empty", "fnm install")) + .then(ExpectCommandOutput::new(Call::new("fnm", vec!["use", "v8.11.3"]).then(Call::new("echo", vec!["empty"])), "empty", "fnm use")) + .then(ExpectCommandOutput::new(Call::new("fnm", vec!["alias", "v8.11.3", "something"]).then(Call::new("echo", vec!["empty"])), "empty", "fnm alias")) + .then(OutputContains::new(IgnoreErrors::new(GetStderr::new(Call::new("fnm", vec!["alias", "abcd", "efg"]))), "Can't find requested version")) + }); +} + +mod list_local_with_nothing_installed { + test_shell!(Bash, Zsh, Fish, PowerShell, WinCmd; { + EvalFnmEnv::default() + .then(Call::new("fnm", vec!["ls"])) + }); +} + +mod latest_lts { + test_shell!(Bash, Zsh, Fish, PowerShell; { + EvalFnmEnv::default() + .then(Call::new("fnm", vec!["install", "--lts"])) + .then(OutputContains::new(Call::new("fnm", vec!["ls"]), "lts-latest")) + .then(Call::new("fnm", vec!["use", "'lts/*'"])) + }); +} + +mod matching_dotfiles { + test_shell!(Bash, Zsh, Fish, PowerShell, WinCmd; { + EvalFnmEnv::default() + .then(WriteFile::new(".nvmrc", "11.10.0")) + .then(WriteFile::new(".node-version", "11.10.0")) + .then(Call::new("fnm", vec!["install"])) + .then(Call::new("fnm", vec!["use"])) + .then(test_node_version("v11.10.0")) + }); +} diff --git a/tests/shellcode/call.rs b/tests/shellcode/call.rs new file mode 100644 index 0000000..abe5b12 --- /dev/null +++ b/tests/shellcode/call.rs @@ -0,0 +1,28 @@ +use super::expression::Expression; +use super::shell::Shell; +use std::fmt::Write; + +#[derive(Debug)] +pub(crate) struct Call { + binary: Box<&'static str>, + args: Vec<&'static str>, +} + +impl Call { + pub(crate) fn new(binary: &'static str, args: Vec<&'static str>) -> Self { + Self { + binary: Box::from(binary), + args, + } + } +} + +impl Expression for Call { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + write!(writer, "{}", self.binary)?; + for arg in &self.args { + write!(writer, " {}", arg)?; + } + Ok(()) + } +} diff --git a/tests/shellcode/die_on_errors.rs b/tests/shellcode/die_on_errors.rs new file mode 100644 index 0000000..31a2ffd --- /dev/null +++ b/tests/shellcode/die_on_errors.rs @@ -0,0 +1,43 @@ +use super::expression::Expression; +use super::shell::{Bash, Fish, PowerShell, WinCmd, Zsh}; +use indoc::writedoc; +use std::fmt::Write; + +#[derive(Debug)] +pub(crate) struct DieOnErrors; + +impl Expression for DieOnErrors { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + writedoc!( + writer, + r#" + set -e + shopt -s expand_aliases + "# + ) + } +} + +impl Expression for DieOnErrors { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + write!(writer, "set -e") + } +} + +impl Expression for DieOnErrors { + fn write_shell(&self, _writer: &mut impl Write) -> std::fmt::Result { + Ok(()) + } +} + +impl Expression for DieOnErrors { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + write!(writer, r#"$ErrorActionPreference = "Stop""#) + } +} + +impl Expression for DieOnErrors { + fn write_shell(&self, _writer: &mut impl Write) -> std::fmt::Result { + Ok(()) + } +} diff --git a/tests/shellcode/eval_fnm_env.rs b/tests/shellcode/eval_fnm_env.rs new file mode 100644 index 0000000..fd1d654 --- /dev/null +++ b/tests/shellcode/eval_fnm_env.rs @@ -0,0 +1,63 @@ +use super::expression::Expression; +use super::shell::{Bash, Fish, PowerShell, WinCmd, Zsh}; +use std::fmt::Write; + +#[derive(Debug, Default)] +pub(crate) struct EvalFnmEnv { + use_on_cd: bool, + log_level: Option<&'static str>, +} + +impl EvalFnmEnv { + pub(crate) fn use_on_cd(self, use_on_cd: bool) -> Self { + Self { use_on_cd, ..self } + } + + pub(crate) fn log_level(self, log_level: Option<&'static str>) -> Self { + Self { log_level, ..self } + } +} + +impl std::fmt::Display for EvalFnmEnv { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "fnm")?; + if let Some(log_level) = &self.log_level { + write!(f, " --log-level='{}'", log_level)?; + } + write!(f, " env")?; + if self.use_on_cd { + write!(f, " --use-on-cd")?; + } + Ok(()) + } +} + +impl Expression for EvalFnmEnv { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + write!(writer, r#"FOR /f "tokens=*" %i IN ('{}') DO CALL %i"#, self) + } +} + +impl Expression for EvalFnmEnv { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + write!(writer, r#"{} | Out-String | Invoke-Expression"#, self) + } +} + +impl Expression for EvalFnmEnv { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + write!(writer, r#"eval "$({})""#, self) + } +} + +impl Expression for EvalFnmEnv { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + write!(writer, r#"eval "$({})""#, self) + } +} + +impl Expression for EvalFnmEnv { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + write!(writer, r#"{} | source"#, self) + } +} diff --git a/tests/shellcode/expect_command_output.rs b/tests/shellcode/expect_command_output.rs new file mode 100644 index 0000000..329c796 --- /dev/null +++ b/tests/shellcode/expect_command_output.rs @@ -0,0 +1,128 @@ +use super::expression::Expression; +use super::shell::{Bash, Fish, PowerShell, Shell, WinCmd, Zsh}; +use indoc::writedoc; +use std::fmt::Write; + +#[derive(Debug)] +pub(crate) struct ExpectCommandOutput> { + _shell: std::marker::PhantomData, + command: Command, + expected_output: &'static str, + message: &'static str, +} + +impl> ExpectCommandOutput { + pub(crate) fn new( + command: Command, + expected_output: &'static str, + message: &'static str, + ) -> Self { + Self { + _shell: std::marker::PhantomData, + command, + expected_output, + message, + } + } +} + +impl> Expression for ExpectCommandOutput { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + let mut command = String::new(); + self.command.write_shell(&mut command)?; + + writedoc!( + writer, + r#" + if [ "$({command})" != "{expected_output}" ]; then + echo 'Expected {message} to be {expected_output:?}, Got: '"$({command})" + exit 1 + fi + "#, + command = command, + message = self.message, + expected_output = self.expected_output, + ) + } +} + +impl> Expression for ExpectCommandOutput { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + let mut command = String::new(); + self.command.write_shell(&mut command)?; + + writedoc!( + writer, + r#" + if [ "$({command})" != "{expected_output}" ]; then + echo 'Expected {message} to be {expected_output:?}, Got: '"$({command})" + exit 1 + fi + "#, + command = command, + message = self.message, + expected_output = self.expected_output, + ) + } +} + +impl> Expression for ExpectCommandOutput { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + let mut command = String::new(); + self.command.write_shell(&mut command)?; + + writedoc!( + writer, + r#" + if test ({command}) != "{expected_output}" + echo 'Expected {message} to be {expected_output:?}, Got: '({command}) + exit 1 + end + "#, + command = command, + expected_output = self.expected_output, + message = self.message, + ) + } +} + +impl> Expression for ExpectCommandOutput { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + let mut command = String::new(); + self.command.write_shell(&mut command)?; + + writedoc!( + writer, + r#" + If ("$({command})" -ne "{expected_output}") {{ + Write-Output ('Expected {message} to be {expected_output:?}, Got: ' + $({command})) + exit 1 + }} + "#, + command = command, + expected_output = self.expected_output, + message = self.message, + ) + } +} + +impl> Expression for ExpectCommandOutput { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + let mut command = String::new(); + self.command.write_shell(&mut command)?; + + writedoc!( + writer, + r#" + {command} | findstr {expected_output} + if %errorlevel% neq 0 ( + echo {message} does not match {expected_output:?} + exit 1 + ) + "#, + command = command, + expected_output = WinCmd::shell_escape(self.expected_output), + message = self.message, + ) + } +} diff --git a/tests/shellcode/expression.rs b/tests/shellcode/expression.rs new file mode 100644 index 0000000..a00e531 --- /dev/null +++ b/tests/shellcode/expression.rs @@ -0,0 +1,21 @@ +use super::line_separated_expressions::LineSeparatedExpressions; +use super::shell::Shell; +use std::fmt::{Debug, Write}; + +pub(crate) trait Expression: Debug + Sized { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result; + + fn then>(self, other: B) -> LineSeparatedExpressions { + LineSeparatedExpressions { + _shell: std::marker::PhantomData, + a: self, + b: other, + } + } +} + +impl Expression for () { + fn write_shell(&self, _writer: &mut impl Write) -> std::fmt::Result { + Ok(()) + } +} diff --git a/tests/shellcode/get_stderr.rs b/tests/shellcode/get_stderr.rs new file mode 100644 index 0000000..328e9ba --- /dev/null +++ b/tests/shellcode/get_stderr.rs @@ -0,0 +1,25 @@ +use super::*; +use std::marker::PhantomData; + +#[derive(Debug)] +pub(crate) struct GetStderr> { + _s: PhantomData, + expr: E, +} + +impl> GetStderr { + pub(crate) fn new(expr: E) -> Self { + Self { + _s: PhantomData, + expr, + } + } +} + +impl> Expression for GetStderr { + fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { + self.expr.write_shell(writer)?; + write!(writer, " 2>&1")?; + Ok(()) + } +} diff --git a/tests/shellcode/ignore_errors.rs b/tests/shellcode/ignore_errors.rs new file mode 100644 index 0000000..4d52b71 --- /dev/null +++ b/tests/shellcode/ignore_errors.rs @@ -0,0 +1,49 @@ +use super::*; +use std::marker::PhantomData; + +#[derive(Debug)] +pub(crate) struct IgnoreErrors> { + _s: PhantomData, + expr: E, +} + +impl> IgnoreErrors { + pub(crate) fn new(expr: E) -> Self { + Self { + _s: PhantomData, + expr, + } + } +} + +impl> Expression for IgnoreErrors { + fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { + self.expr.write_shell(writer)?; + Ok(()) + } +} + +impl> Expression for IgnoreErrors { + fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { + self.expr.write_shell(writer)?; + Ok(()) + } +} + +impl> Expression for IgnoreErrors { + fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { + self.expr.write_shell(writer)?; + Ok(()) + } +} + +impl> Expression for IgnoreErrors { + fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { + write!(writer, r#"$($_tmp_err_action = $ErrorActionPreference;"#)?; + write!(writer, r#"$ErrorActionPreference = "Continue";"#)?; + self.expr.write_shell(writer)?; + write!(writer, ";")?; + write!(writer, r#"$ErrorActionPreference = $_tmp_err_action)"#)?; + Ok(()) + } +} diff --git a/tests/shellcode/line_separated_expressions.rs b/tests/shellcode/line_separated_expressions.rs new file mode 100644 index 0000000..6ef1cc1 --- /dev/null +++ b/tests/shellcode/line_separated_expressions.rs @@ -0,0 +1,62 @@ +use super::expression::Expression; +use super::shell::Shell; +use std::fmt::Write; +use std::marker::PhantomData; + +#[derive(Debug)] +pub(crate) struct LineSeparatedExpressions, B: Expression> { + pub(crate) _shell: std::marker::PhantomData, + pub(crate) a: A, + pub(crate) b: B, +} + +impl, B: Expression> LineSeparatedExpressions { + pub fn then>( + self, + c: C, + ) -> LineSeparatedExpressions, C> { + LineSeparatedExpressions { + _shell: PhantomData, + a: self, + b: c, + } + } +} + +impl> LineSeparatedExpressions { + pub(crate) fn new(b: B) -> Self { + Self { + _shell: std::marker::PhantomData, + a: (), + b, + } + } +} + +impl, B: Expression> Expression + for LineSeparatedExpressions +{ + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + self.a.write_shell(writer)?; + write!(writer, "\n")?; + self.b.write_shell(writer) + } +} + +mod tests { + use super::super::raw::Raw; + use super::super::shell::Zsh; + use super::*; + use pretty_assertions::assert_eq; + + #[test] + fn test_line_separated_expression() { + let mut s = String::new(); + LineSeparatedExpressions::::new(Raw("Hello".into())) + .then(Raw("World".into())) + .then(Raw("Other".into())) + .write_shell(&mut s) + .unwrap(); + assert_eq!(s.trim(), "Hello\nWorld\nOther"); + } +} diff --git a/tests/shellcode/mod.rs b/tests/shellcode/mod.rs new file mode 100644 index 0000000..d55540d --- /dev/null +++ b/tests/shellcode/mod.rs @@ -0,0 +1,113 @@ +mod call; +mod die_on_errors; +mod eval_fnm_env; +mod expect_command_output; +mod expression; +mod get_stderr; +mod ignore_errors; +mod line_separated_expressions; +mod nothing; +mod output_contains; +mod raw; +mod shell; +mod sub_shell; +mod test_node_version; +mod write_file; + +#[allow(unused)] +pub use call::*; +#[allow(unused)] +pub use die_on_errors::*; +#[allow(unused)] +pub use eval_fnm_env::*; +#[allow(unused)] +pub use expect_command_output::*; +#[allow(unused)] +pub use expression::*; +#[allow(unused)] +pub use get_stderr::*; +#[allow(unused)] +pub use ignore_errors::*; +#[allow(unused)] +#[allow(unused)] +pub use line_separated_expressions::*; +#[allow(unused)] +pub use nothing::*; +#[allow(unused)] +pub use output_contains::*; +#[allow(unused)] +pub use raw::*; +#[allow(unused)] +pub use shell::*; +#[allow(unused)] +pub use sub_shell::*; +#[allow(unused)] +pub use test_node_version::*; +#[allow(unused)] +pub use write_file::*; + +use std::path::Path; + +pub(crate) fn run_test_file(dir: &Path, shell: &impl Shell, code: &str) { + let fnm_dir = tempfile::tempdir().unwrap(); + let target_dir = std::path::PathBuf::from(env!("CARGO_BIN_EXE_fnm")) + .parent() + .unwrap() + .to_path_buf(); + let path_str = { + let path_env = std::env::var("PATH").unwrap(); + let mut path_split: Vec<_> = std::env::split_paths(&path_env).collect(); + path_split.insert(0, target_dir); + path_split.insert(0, dir.join("bin")); // for custom binaries + std::env::join_paths(path_split).unwrap() + }; + duct::cmd(shell.binary_name(), shell.launch_args()) + .env("PATH", path_str) + .env("FNM_DIR", fnm_dir.path()) + .env("HOME", tempfile::tempdir().unwrap().path()) + .env_remove("FNM_MULTISHELL_PATH") + .dir(dir) + .stdin_bytes(code) + .run() + .unwrap(); +} + +#[macro_export] +macro_rules! test_shell { + ($($shell:ident),+; $block:block) => { + test_shell!($($shell),+; |_path| $block); + }; + ($($shell:ident),+; $f:expr) => { + $( + #[test] + #[serial_test::serial] + #[allow(non_snake_case)] + fn $shell() { + use super::*; + #[allow(unused)] + use pretty_assertions::assert_eq; + let current_dir = tempfile::tempdir().expect("Can't create a temp dir"); + let shell = $crate::shellcode::$shell; + + let mut source = String::new(); + empty_shell_script(&shell) + .then($crate::shellcode::DieOnErrors) + .then(($f)(current_dir.path())) + .write_shell(&mut source) + .expect("Can't create shell script"); + + insta::assert_snapshot!(&source.trim()); + + if !shell.currently_supported() { + return; + } + + $crate::shellcode::run_test_file( + current_dir.path(), + &shell, + &source.trim() + ); + } + )+ + }; +} diff --git a/tests/shellcode/nothing.rs b/tests/shellcode/nothing.rs new file mode 100644 index 0000000..ade91c5 --- /dev/null +++ b/tests/shellcode/nothing.rs @@ -0,0 +1,19 @@ +use super::expression::Expression; +use super::shell::Shell; +use std::fmt::Write; +use std::marker::PhantomData; + +#[derive(Debug)] +pub(crate) struct Nothing { + shell: PhantomData, +} + +pub(crate) fn empty_shell_script(_s: &S) -> Nothing { + Nothing { shell: PhantomData } +} + +impl Expression for Nothing { + fn write_shell(&self, _writer: &mut impl Write) -> std::fmt::Result { + Ok(()) + } +} diff --git a/tests/shellcode/output_contains.rs b/tests/shellcode/output_contains.rs new file mode 100644 index 0000000..fc1395e --- /dev/null +++ b/tests/shellcode/output_contains.rs @@ -0,0 +1,65 @@ +use super::*; +use std::marker::PhantomData; + +#[derive(Debug)] +pub(crate) struct OutputContains> { + _s: PhantomData, + output_of: Output, + contains: &'static str, +} + +impl> OutputContains { + pub(crate) fn new(output_of: Output, contains: &'static str) -> Self { + Self { + _s: PhantomData, + output_of, + contains, + } + } +} + +impl> Expression for OutputContains { + fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { + self.output_of.write_shell(writer)?; + write!(writer, " | grep {}", Zsh::shell_escape(self.contains)) + } +} + +impl> Expression for OutputContains { + fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { + self.output_of.write_shell(writer)?; + write!(writer, " | grep {}", Bash::shell_escape(self.contains)) + } +} + +impl> Expression for OutputContains { + fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { + self.output_of.write_shell(writer)?; + write!(writer, " | grep {}", Fish::shell_escape(self.contains)) + } +} + +impl> Expression for OutputContains { + fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { + // $($__out__ = (fnm ls | findstr 6.11.3); if ($LASTEXITCODE -ne 0) { "WELP" } else { $__out__ }) + write!(writer, "$(")?; + { + write!(writer, "$__out__ = $(")?; + { + self.output_of.write_shell(writer)?; + write!( + writer, + " | Select-String {}", + PowerShell::shell_escape(self.contains) + )?; + } + write!(writer, "); ")?; + write!(writer, "echo $__out__; ")?; + write!(writer, "if ($__out__ -eq $null)")?; + write!(writer, "{{ exit 1 }} ")?; + write!(writer, "else {{ $__out__ }}")?; + } + write!(writer, ")")?; + Ok(()) + } +} diff --git a/tests/shellcode/raw.rs b/tests/shellcode/raw.rs new file mode 100644 index 0000000..63acac4 --- /dev/null +++ b/tests/shellcode/raw.rs @@ -0,0 +1,13 @@ +use super::expression::Expression; +use super::shell::Shell; +use std::fmt::Write; + +/// For debugging purposes +#[derive(Debug)] +pub(crate) struct Raw(pub String); + +impl Expression for Raw { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + write!(writer, "{}", self.0) + } +} diff --git a/tests/shellcode/shell.rs b/tests/shellcode/shell.rs new file mode 100644 index 0000000..3bc45f0 --- /dev/null +++ b/tests/shellcode/shell.rs @@ -0,0 +1,112 @@ +use std::borrow::Cow; +use std::fmt::Debug; + +pub(crate) trait Shell: Debug { + fn currently_supported(&self) -> bool; + fn name(&self) -> &'static str; + fn binary_name(&self) -> &'static str; + fn shell_escape(str: &str) -> Cow; + fn launch_args(&self) -> &'static [&'static str] { + &[] + } +} + +#[derive(Debug)] +pub(crate) struct Fish; +impl Shell for Fish { + fn currently_supported(&self) -> bool { + cfg!(not(windows)) + } + fn name(&self) -> &'static str { + "fish" + } + fn binary_name(&self) -> &'static str { + "fish" + } + fn shell_escape(str: &str) -> Cow { + shell_escape::unix::escape(Cow::from(str)) + } +} + +#[derive(Debug)] +pub(crate) struct Bash; +impl Shell for Bash { + fn currently_supported(&self) -> bool { + true + } + fn name(&self) -> &'static str { + "bash" + } + fn binary_name(&self) -> &'static str { + "bash" + } + fn shell_escape(str: &str) -> Cow { + shell_escape::unix::escape(Cow::from(str)) + } +} + +#[derive(Debug)] +pub(crate) struct Zsh; +impl Shell for Zsh { + fn currently_supported(&self) -> bool { + cfg!(not(windows)) + } + fn name(&self) -> &'static str { + "zsh" + } + fn binary_name(&self) -> &'static str { + "zsh" + } + fn shell_escape(str: &str) -> Cow { + shell_escape::unix::escape(Cow::from(str)) + } +} + +#[derive(Debug)] +pub(crate) struct WinCmd; +impl Shell for WinCmd { + fn currently_supported(&self) -> bool { + cfg!(windows) + } + fn name(&self) -> &'static str { + "win_cmd" + } + fn binary_name(&self) -> &'static str { + "cmd" + } + fn shell_escape(str: &str) -> Cow { + Cow::from( + str.replace('\r', "") + .replace('\n', "^\n\n") + .replace('%', "%%") + .replace('|', "^|") + .replace('(', "^(") + .replace(')', "^)"), + ) + } +} + +#[derive(Debug)] +pub(crate) struct PowerShell; +impl Shell for PowerShell { + fn currently_supported(&self) -> bool { + true + } + fn name(&self) -> &'static str { + "powershell" + } + fn binary_name(&self) -> &'static str { + if cfg!(windows) { + "powershell" + } else { + "pwsh" + } + } + fn shell_escape(str: &str) -> Cow { + let new_str = format!("'{}'", str.replace('\'', "''")); + Cow::from(new_str) + } + fn launch_args(&self) -> &'static [&'static str] { + &["-NoProfile"] + } +} diff --git a/tests/shellcode/sub_shell.rs b/tests/shellcode/sub_shell.rs new file mode 100644 index 0000000..79fd353 --- /dev/null +++ b/tests/shellcode/sub_shell.rs @@ -0,0 +1,55 @@ +use super::expression::Expression; +use super::shell::*; +use std::fmt::Write; +use std::marker::PhantomData; + +#[derive(Debug)] +pub(crate) struct SubShell> { + _s: PhantomData, + expression: Exp, +} + +impl> SubShell { + pub(crate) fn new(expression: Exp) -> Self { + Self { + _s: PhantomData, + expression, + } + } +} + +impl> Expression for SubShell { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + let mut s = String::new(); + self.expression.write_shell(&mut s)?; + write!(writer, r#"echo {} | zsh"#, Zsh::shell_escape(&s)) + } +} + +impl> Expression for SubShell { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + let mut s = String::new(); + self.expression.write_shell(&mut s)?; + write!(writer, r#"echo {} | bash"#, Bash::shell_escape(&s)) + } +} + +impl> Expression for SubShell { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + let mut s = String::new(); + self.expression.write_shell(&mut s)?; + write!(writer, r#"fish -c {}"#, Fish::shell_escape(&s)) + } +} + +impl> Expression for SubShell { + fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { + let mut s = String::new(); + self.expression.write_shell(&mut s)?; + write!( + writer, + r#"echo {} | powershell -NoProfile"#, + PowerShell::shell_escape(&s) + ) + } +} diff --git a/tests/shellcode/test_node_version.rs b/tests/shellcode/test_node_version.rs new file mode 100644 index 0000000..0d64899 --- /dev/null +++ b/tests/shellcode/test_node_version.rs @@ -0,0 +1,12 @@ +use super::shell::Shell; +use super::{Call, ExpectCommandOutput}; + +pub(crate) fn test_node_version( + expected_version: &'static str, +) -> ExpectCommandOutput { + ExpectCommandOutput::new( + Call::new("node", vec!["-v"]), + expected_version, + "Node version", + ) +} diff --git a/tests/shellcode/write_file.rs b/tests/shellcode/write_file.rs new file mode 100644 index 0000000..f31f840 --- /dev/null +++ b/tests/shellcode/write_file.rs @@ -0,0 +1,24 @@ +use super::*; + +#[derive(Debug)] +pub struct WriteFile { + name: &'static str, + contents: &'static str, +} + +impl WriteFile { + pub(crate) fn new(name: &'static str, contents: &'static str) -> Self { + Self { name, contents } + } +} + +impl Expression for WriteFile { + fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { + write!( + writer, + "echo {} > {}", + S::shell_escape(self.contents), + S::shell_escape(self.name) + ) + } +} diff --git a/tests/snapshots/e2e__feature_tests__aliases__Bash.snap b/tests/snapshots/e2e__feature_tests__aliases__Bash.snap new file mode 100644 index 0000000..4f75171 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__aliases__Bash.snap @@ -0,0 +1,32 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +fnm install 6.11.3 +fnm install 8.11.3 +fnm alias 8.11 oldie +fnm alias 6 older +fnm default older +fnm ls | grep 8.11.3 | grep oldie +fnm ls | grep 6.11.3 | grep older | grep default +fnm use older +if [ "$(node -v)" != "v6.11.3" ]; then + echo 'Expected Node version to be "v6.11.3", Got: '"$(node -v)" + exit 1 +fi + +fnm use oldie +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi + +fnm use default +if [ "$(node -v)" != "v6.11.3" ]; then + echo 'Expected Node version to be "v6.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__aliases__Fish.snap b/tests/snapshots/e2e__feature_tests__aliases__Fish.snap new file mode 100644 index 0000000..58c5a2c --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__aliases__Fish.snap @@ -0,0 +1,29 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +fnm install 6.11.3 +fnm install 8.11.3 +fnm alias 8.11 oldie +fnm alias 6 older +fnm default older +fnm ls | grep 8.11.3 | grep oldie +fnm ls | grep 6.11.3 | grep older | grep default +fnm use older +if test (node -v) != "v6.11.3" + echo 'Expected Node version to be "v6.11.3", Got: '(node -v) + exit 1 +end + +fnm use oldie +if test (node -v) != "v8.11.3" + echo 'Expected Node version to be "v8.11.3", Got: '(node -v) + exit 1 +end + +fnm use default +if test (node -v) != "v6.11.3" + echo 'Expected Node version to be "v6.11.3", Got: '(node -v) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__aliases__PowerShell.snap b/tests/snapshots/e2e__feature_tests__aliases__PowerShell.snap new file mode 100644 index 0000000..ac9ecf8 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__aliases__PowerShell.snap @@ -0,0 +1,30 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install 6.11.3 +fnm install 8.11.3 +fnm alias 8.11 oldie +fnm alias 6 older +fnm default older +$($__out__ = $($($__out__ = $(fnm ls | Select-String '8.11.3'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) | Select-String 'oldie'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) +$($__out__ = $($($__out__ = $($($__out__ = $(fnm ls | Select-String '6.11.3'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) | Select-String 'older'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) | Select-String 'default'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) +fnm use older +If ("$(node -v)" -ne "v6.11.3") { + Write-Output ('Expected Node version to be "v6.11.3", Got: ' + $(node -v)) + exit 1 +} + +fnm use oldie +If ("$(node -v)" -ne "v8.11.3") { + Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) + exit 1 +} + +fnm use default +If ("$(node -v)" -ne "v6.11.3") { + Write-Output ('Expected Node version to be "v6.11.3", Got: ' + $(node -v)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__aliases__Zsh.snap b/tests/snapshots/e2e__feature_tests__aliases__Zsh.snap new file mode 100644 index 0000000..02dde0f --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__aliases__Zsh.snap @@ -0,0 +1,30 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +fnm install 6.11.3 +fnm install 8.11.3 +fnm alias 8.11 oldie +fnm alias 6 older +fnm default older +fnm ls | grep 8.11.3 | grep oldie +fnm ls | grep 6.11.3 | grep older | grep default +fnm use older +if [ "$(node -v)" != "v6.11.3" ]; then + echo 'Expected Node version to be "v6.11.3", Got: '"$(node -v)" + exit 1 +fi + +fnm use oldie +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi + +fnm use default +if [ "$(node -v)" != "v6.11.3" ]; then + echo 'Expected Node version to be "v6.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__basic__Bash.snap b/tests/snapshots/e2e__feature_tests__basic__Bash.snap new file mode 100644 index 0000000..932b6ee --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__basic__Bash.snap @@ -0,0 +1,14 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +fnm install v8.11.3 +fnm use v8.11.3 +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__basic__Fish.snap b/tests/snapshots/e2e__feature_tests__basic__Fish.snap new file mode 100644 index 0000000..8e889f5 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__basic__Fish.snap @@ -0,0 +1,11 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +fnm install v8.11.3 +fnm use v8.11.3 +if test (node -v) != "v8.11.3" + echo 'Expected Node version to be "v8.11.3", Got: '(node -v) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__basic__PowerShell.snap b/tests/snapshots/e2e__feature_tests__basic__PowerShell.snap new file mode 100644 index 0000000..36e04d4 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__basic__PowerShell.snap @@ -0,0 +1,12 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install v8.11.3 +fnm use v8.11.3 +If ("$(node -v)" -ne "v8.11.3") { + Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__basic__WinCmd.snap b/tests/snapshots/e2e__feature_tests__basic__WinCmd.snap new file mode 100644 index 0000000..7582768 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__basic__WinCmd.snap @@ -0,0 +1,12 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i +fnm install v8.11.3 +fnm use v8.11.3 +node -v | findstr v8.11.3 +if %errorlevel% neq 0 ( + echo Node version does not match "v8.11.3" + exit 1 +) diff --git a/tests/snapshots/e2e__feature_tests__basic__Zsh.snap b/tests/snapshots/e2e__feature_tests__basic__Zsh.snap new file mode 100644 index 0000000..e1644d3 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__basic__Zsh.snap @@ -0,0 +1,12 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +fnm install v8.11.3 +fnm use v8.11.3 +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__current__Bash.snap b/tests/snapshots/e2e__feature_tests__current__Bash.snap new file mode 100644 index 0000000..0069975 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__current__Bash.snap @@ -0,0 +1,32 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +if [ "$(fnm current)" != "none" ]; then + echo 'Expected currently activated version to be "none", Got: '"$(fnm current)" + exit 1 +fi + +fnm install v8.11.3 +fnm install v10.10.0 +fnm use v8.11.3 +if [ "$(fnm current)" != "v8.11.3" ]; then + echo 'Expected currently activated version to be "v8.11.3", Got: '"$(fnm current)" + exit 1 +fi + +fnm use v10.10.0 +if [ "$(fnm current)" != "v10.10.0" ]; then + echo 'Expected currently activated version to be "v10.10.0", Got: '"$(fnm current)" + exit 1 +fi + +fnm use system +if [ "$(fnm current)" != "system" ]; then + echo 'Expected currently activated version to be "system", Got: '"$(fnm current)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__current__Fish.snap b/tests/snapshots/e2e__feature_tests__current__Fish.snap new file mode 100644 index 0000000..9942e33 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__current__Fish.snap @@ -0,0 +1,29 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +if test (fnm current) != "none" + echo 'Expected currently activated version to be "none", Got: '(fnm current) + exit 1 +end + +fnm install v8.11.3 +fnm install v10.10.0 +fnm use v8.11.3 +if test (fnm current) != "v8.11.3" + echo 'Expected currently activated version to be "v8.11.3", Got: '(fnm current) + exit 1 +end + +fnm use v10.10.0 +if test (fnm current) != "v10.10.0" + echo 'Expected currently activated version to be "v10.10.0", Got: '(fnm current) + exit 1 +end + +fnm use system +if test (fnm current) != "system" + echo 'Expected currently activated version to be "system", Got: '(fnm current) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__current__PowerShell.snap b/tests/snapshots/e2e__feature_tests__current__PowerShell.snap new file mode 100644 index 0000000..3c748c0 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__current__PowerShell.snap @@ -0,0 +1,30 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +If ("$(fnm current)" -ne "none") { + Write-Output ('Expected currently activated version to be "none", Got: ' + $(fnm current)) + exit 1 +} + +fnm install v8.11.3 +fnm install v10.10.0 +fnm use v8.11.3 +If ("$(fnm current)" -ne "v8.11.3") { + Write-Output ('Expected currently activated version to be "v8.11.3", Got: ' + $(fnm current)) + exit 1 +} + +fnm use v10.10.0 +If ("$(fnm current)" -ne "v10.10.0") { + Write-Output ('Expected currently activated version to be "v10.10.0", Got: ' + $(fnm current)) + exit 1 +} + +fnm use system +If ("$(fnm current)" -ne "system") { + Write-Output ('Expected currently activated version to be "system", Got: ' + $(fnm current)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__current__WinCmd.snap b/tests/snapshots/e2e__feature_tests__current__WinCmd.snap new file mode 100644 index 0000000..4613797 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__current__WinCmd.snap @@ -0,0 +1,33 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i +fnm current | findstr none +if %errorlevel% neq 0 ( + echo currently activated version does not match "none" + exit 1 +) + +fnm install v8.11.3 +fnm install v10.10.0 +fnm use v8.11.3 +fnm current | findstr v8.11.3 +if %errorlevel% neq 0 ( + echo currently activated version does not match "v8.11.3" + exit 1 +) + +fnm use v10.10.0 +fnm current | findstr v10.10.0 +if %errorlevel% neq 0 ( + echo currently activated version does not match "v10.10.0" + exit 1 +) + +fnm use system +fnm current | findstr system +if %errorlevel% neq 0 ( + echo currently activated version does not match "system" + exit 1 +) diff --git a/tests/snapshots/e2e__feature_tests__current__Zsh.snap b/tests/snapshots/e2e__feature_tests__current__Zsh.snap new file mode 100644 index 0000000..0065244 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__current__Zsh.snap @@ -0,0 +1,30 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +if [ "$(fnm current)" != "none" ]; then + echo 'Expected currently activated version to be "none", Got: '"$(fnm current)" + exit 1 +fi + +fnm install v8.11.3 +fnm install v10.10.0 +fnm use v8.11.3 +if [ "$(fnm current)" != "v8.11.3" ]; then + echo 'Expected currently activated version to be "v8.11.3", Got: '"$(fnm current)" + exit 1 +fi + +fnm use v10.10.0 +if [ "$(fnm current)" != "v10.10.0" ]; then + echo 'Expected currently activated version to be "v10.10.0", Got: '"$(fnm current)" + exit 1 +fi + +fnm use system +if [ "$(fnm current)" != "system" ]; then + echo 'Expected currently activated version to be "system", Got: '"$(fnm current)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__exec__Bash.snap b/tests/snapshots/e2e__feature_tests__exec__Bash.snap new file mode 100644 index 0000000..c0f3d15 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__exec__Bash.snap @@ -0,0 +1,26 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +echo v8.10.0 > .nvmrc +fnm install +fnm install v6.10.0 +fnm install v10.10.0 +if [ "$(fnm exec -- node -v)" != "v8.10.0" ]; then + echo 'Expected version file exec to be "v8.10.0", Got: '"$(fnm exec -- node -v)" + exit 1 +fi + +if [ "$(fnm exec --using=6 -- node -v)" != "v6.10.0" ]; then + echo 'Expected exec:6 node -v to be "v6.10.0", Got: '"$(fnm exec --using=6 -- node -v)" + exit 1 +fi + +if [ "$(fnm exec --using=10 -- node -v)" != "v10.10.0" ]; then + echo 'Expected exec:6 node -v to be "v10.10.0", Got: '"$(fnm exec --using=10 -- node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__exec__Fish.snap b/tests/snapshots/e2e__feature_tests__exec__Fish.snap new file mode 100644 index 0000000..7bc86fc --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__exec__Fish.snap @@ -0,0 +1,23 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +echo v8.10.0 > .nvmrc +fnm install +fnm install v6.10.0 +fnm install v10.10.0 +if test (fnm exec -- node -v) != "v8.10.0" + echo 'Expected version file exec to be "v8.10.0", Got: '(fnm exec -- node -v) + exit 1 +end + +if test (fnm exec --using=6 -- node -v) != "v6.10.0" + echo 'Expected exec:6 node -v to be "v6.10.0", Got: '(fnm exec --using=6 -- node -v) + exit 1 +end + +if test (fnm exec --using=10 -- node -v) != "v10.10.0" + echo 'Expected exec:6 node -v to be "v10.10.0", Got: '(fnm exec --using=10 -- node -v) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__exec__PowerShell.snap b/tests/snapshots/e2e__feature_tests__exec__PowerShell.snap new file mode 100644 index 0000000..a09e925 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__exec__PowerShell.snap @@ -0,0 +1,24 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +echo 'v8.10.0' > '.nvmrc' +fnm install +fnm install v6.10.0 +fnm install v10.10.0 +If ("$(fnm exec -- node -v)" -ne "v8.10.0") { + Write-Output ('Expected version file exec to be "v8.10.0", Got: ' + $(fnm exec -- node -v)) + exit 1 +} + +If ("$(fnm exec --using=6 -- node -v)" -ne "v6.10.0") { + Write-Output ('Expected exec:6 node -v to be "v6.10.0", Got: ' + $(fnm exec --using=6 -- node -v)) + exit 1 +} + +If ("$(fnm exec --using=10 -- node -v)" -ne "v10.10.0") { + Write-Output ('Expected exec:6 node -v to be "v10.10.0", Got: ' + $(fnm exec --using=10 -- node -v)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__exec__WinCmd.snap b/tests/snapshots/e2e__feature_tests__exec__WinCmd.snap new file mode 100644 index 0000000..f8ba17c --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__exec__WinCmd.snap @@ -0,0 +1,26 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i +echo v8.10.0 > .nvmrc +fnm install +fnm install v6.10.0 +fnm install v10.10.0 +fnm exec -- node -v | findstr v8.10.0 +if %errorlevel% neq 0 ( + echo version file exec does not match "v8.10.0" + exit 1 +) + +fnm exec --using=6 -- node -v | findstr v6.10.0 +if %errorlevel% neq 0 ( + echo exec:6 node -v does not match "v6.10.0" + exit 1 +) + +fnm exec --using=10 -- node -v | findstr v10.10.0 +if %errorlevel% neq 0 ( + echo exec:6 node -v does not match "v10.10.0" + exit 1 +) diff --git a/tests/snapshots/e2e__feature_tests__exec__Zsh.snap b/tests/snapshots/e2e__feature_tests__exec__Zsh.snap new file mode 100644 index 0000000..cc989f8 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__exec__Zsh.snap @@ -0,0 +1,24 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +echo v8.10.0 > .nvmrc +fnm install +fnm install v6.10.0 +fnm install v10.10.0 +if [ "$(fnm exec -- node -v)" != "v8.10.0" ]; then + echo 'Expected version file exec to be "v8.10.0", Got: '"$(fnm exec -- node -v)" + exit 1 +fi + +if [ "$(fnm exec --using=6 -- node -v)" != "v6.10.0" ]; then + echo 'Expected exec:6 node -v to be "v6.10.0", Got: '"$(fnm exec --using=6 -- node -v)" + exit 1 +fi + +if [ "$(fnm exec --using=10 -- node -v)" != "v10.10.0" ]; then + echo 'Expected exec:6 node -v to be "v10.10.0", Got: '"$(fnm exec --using=10 -- node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__existing_installation__Bash.snap b/tests/snapshots/e2e__feature_tests__existing_installation__Bash.snap new file mode 100644 index 0000000..65ba39c --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__existing_installation__Bash.snap @@ -0,0 +1,10 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +fnm install v8.11.3 +fnm install v8.11.3 2>&1 | grep 'already installed' diff --git a/tests/snapshots/e2e__feature_tests__existing_installation__Fish.snap b/tests/snapshots/e2e__feature_tests__existing_installation__Fish.snap new file mode 100644 index 0000000..f89c847 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__existing_installation__Fish.snap @@ -0,0 +1,7 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +fnm install v8.11.3 +fnm install v8.11.3 2>&1 | grep 'already installed' diff --git a/tests/snapshots/e2e__feature_tests__existing_installation__PowerShell.snap b/tests/snapshots/e2e__feature_tests__existing_installation__PowerShell.snap new file mode 100644 index 0000000..a679cd1 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__existing_installation__PowerShell.snap @@ -0,0 +1,8 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install v8.11.3 +$($__out__ = $($($_tmp_err_action = $ErrorActionPreference;$ErrorActionPreference = "Continue";fnm install v8.11.3 2>&1;$ErrorActionPreference = $_tmp_err_action) | Select-String 'already installed'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/snapshots/e2e__feature_tests__existing_installation__Zsh.snap b/tests/snapshots/e2e__feature_tests__existing_installation__Zsh.snap new file mode 100644 index 0000000..47ee7fa --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__existing_installation__Zsh.snap @@ -0,0 +1,8 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +fnm install v8.11.3 +fnm install v8.11.3 2>&1 | grep 'already installed' diff --git a/tests/snapshots/e2e__feature_tests__latest_lts__Bash.snap b/tests/snapshots/e2e__feature_tests__latest_lts__Bash.snap new file mode 100644 index 0000000..e22c769 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__latest_lts__Bash.snap @@ -0,0 +1,11 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +fnm install --lts +fnm ls | grep lts-latest +fnm use 'lts/*' diff --git a/tests/snapshots/e2e__feature_tests__latest_lts__Fish.snap b/tests/snapshots/e2e__feature_tests__latest_lts__Fish.snap new file mode 100644 index 0000000..ff7cacf --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__latest_lts__Fish.snap @@ -0,0 +1,8 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +fnm install --lts +fnm ls | grep lts-latest +fnm use 'lts/*' diff --git a/tests/snapshots/e2e__feature_tests__latest_lts__PowerShell.snap b/tests/snapshots/e2e__feature_tests__latest_lts__PowerShell.snap new file mode 100644 index 0000000..125b396 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__latest_lts__PowerShell.snap @@ -0,0 +1,9 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install --lts +$($__out__ = $(fnm ls | Select-String 'lts-latest'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) +fnm use 'lts/*' diff --git a/tests/snapshots/e2e__feature_tests__latest_lts__Zsh.snap b/tests/snapshots/e2e__feature_tests__latest_lts__Zsh.snap new file mode 100644 index 0000000..2c40963 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__latest_lts__Zsh.snap @@ -0,0 +1,9 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +fnm install --lts +fnm ls | grep lts-latest +fnm use 'lts/*' diff --git a/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Bash.snap b/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Bash.snap new file mode 100644 index 0000000..791dc3e --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Bash.snap @@ -0,0 +1,9 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +fnm ls diff --git a/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Fish.snap b/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Fish.snap new file mode 100644 index 0000000..0838a42 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Fish.snap @@ -0,0 +1,6 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +fnm ls diff --git a/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__PowerShell.snap b/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__PowerShell.snap new file mode 100644 index 0000000..f1014b9 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__PowerShell.snap @@ -0,0 +1,7 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm ls diff --git a/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__WinCmd.snap b/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__WinCmd.snap new file mode 100644 index 0000000..ce395b4 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__WinCmd.snap @@ -0,0 +1,6 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i +fnm ls diff --git a/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Zsh.snap b/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Zsh.snap new file mode 100644 index 0000000..481dfdc --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Zsh.snap @@ -0,0 +1,7 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +fnm ls diff --git a/tests/snapshots/e2e__feature_tests__log_level_error__Bash.snap b/tests/snapshots/e2e__feature_tests__log_level_error__Bash.snap new file mode 100644 index 0000000..4ad4056 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__log_level_error__Bash.snap @@ -0,0 +1,30 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm --log-level='error' env)" +if [ "$(fnm install v8.11.3 +echo empty)" != "empty" ]; then + echo 'Expected fnm install to be "empty", Got: '"$(fnm install v8.11.3 +echo empty)" + exit 1 +fi + +if [ "$(fnm use v8.11.3 +echo empty)" != "empty" ]; then + echo 'Expected fnm use to be "empty", Got: '"$(fnm use v8.11.3 +echo empty)" + exit 1 +fi + +if [ "$(fnm alias v8.11.3 something +echo empty)" != "empty" ]; then + echo 'Expected fnm alias to be "empty", Got: '"$(fnm alias v8.11.3 something +echo empty)" + exit 1 +fi + +fnm alias abcd efg 2>&1 | grep 'Can'\''t find requested version' diff --git a/tests/snapshots/e2e__feature_tests__log_level_error__Fish.snap b/tests/snapshots/e2e__feature_tests__log_level_error__Fish.snap new file mode 100644 index 0000000..72e52e9 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__log_level_error__Fish.snap @@ -0,0 +1,27 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm --log-level='error' env | source +if test (fnm install v8.11.3 +echo empty) != "empty" + echo 'Expected fnm install to be "empty", Got: '(fnm install v8.11.3 +echo empty) + exit 1 +end + +if test (fnm use v8.11.3 +echo empty) != "empty" + echo 'Expected fnm use to be "empty", Got: '(fnm use v8.11.3 +echo empty) + exit 1 +end + +if test (fnm alias v8.11.3 something +echo empty) != "empty" + echo 'Expected fnm alias to be "empty", Got: '(fnm alias v8.11.3 something +echo empty) + exit 1 +end + +fnm alias abcd efg 2>&1 | grep 'Can'\''t find requested version' diff --git a/tests/snapshots/e2e__feature_tests__log_level_error__PowerShell.snap b/tests/snapshots/e2e__feature_tests__log_level_error__PowerShell.snap new file mode 100644 index 0000000..a0014c6 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__log_level_error__PowerShell.snap @@ -0,0 +1,28 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm --log-level='error' env | Out-String | Invoke-Expression +If ("$(fnm install v8.11.3 +echo empty)" -ne "empty") { + Write-Output ('Expected fnm install to be "empty", Got: ' + $(fnm install v8.11.3 +echo empty)) + exit 1 +} + +If ("$(fnm use v8.11.3 +echo empty)" -ne "empty") { + Write-Output ('Expected fnm use to be "empty", Got: ' + $(fnm use v8.11.3 +echo empty)) + exit 1 +} + +If ("$(fnm alias v8.11.3 something +echo empty)" -ne "empty") { + Write-Output ('Expected fnm alias to be "empty", Got: ' + $(fnm alias v8.11.3 something +echo empty)) + exit 1 +} + +$($__out__ = $($($_tmp_err_action = $ErrorActionPreference;$ErrorActionPreference = "Continue";fnm alias abcd efg 2>&1;$ErrorActionPreference = $_tmp_err_action) | Select-String 'Can''t find requested version'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/snapshots/e2e__feature_tests__log_level_error__Zsh.snap b/tests/snapshots/e2e__feature_tests__log_level_error__Zsh.snap new file mode 100644 index 0000000..01aacf2 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__log_level_error__Zsh.snap @@ -0,0 +1,28 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm --log-level='error' env)" +if [ "$(fnm install v8.11.3 +echo empty)" != "empty" ]; then + echo 'Expected fnm install to be "empty", Got: '"$(fnm install v8.11.3 +echo empty)" + exit 1 +fi + +if [ "$(fnm use v8.11.3 +echo empty)" != "empty" ]; then + echo 'Expected fnm use to be "empty", Got: '"$(fnm use v8.11.3 +echo empty)" + exit 1 +fi + +if [ "$(fnm alias v8.11.3 something +echo empty)" != "empty" ]; then + echo 'Expected fnm alias to be "empty", Got: '"$(fnm alias v8.11.3 something +echo empty)" + exit 1 +fi + +fnm alias abcd efg 2>&1 | grep 'Can'\''t find requested version' diff --git a/tests/snapshots/e2e__feature_tests__log_level_quiet__Bash.snap b/tests/snapshots/e2e__feature_tests__log_level_quiet__Bash.snap new file mode 100644 index 0000000..f999259 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__log_level_quiet__Bash.snap @@ -0,0 +1,22 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm --log-level='quiet' env)" +if [ "$(fnm install v8.11.3)" != "" ]; then + echo 'Expected fnm install to be "", Got: '"$(fnm install v8.11.3)" + exit 1 +fi + +if [ "$(fnm use v8.11.3)" != "" ]; then + echo 'Expected fnm use to be "", Got: '"$(fnm use v8.11.3)" + exit 1 +fi + +if [ "$(fnm alias v8.11.3 something)" != "" ]; then + echo 'Expected fnm alias to be "", Got: '"$(fnm alias v8.11.3 something)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__log_level_quiet__Fish.snap b/tests/snapshots/e2e__feature_tests__log_level_quiet__Fish.snap new file mode 100644 index 0000000..95b529b --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__log_level_quiet__Fish.snap @@ -0,0 +1,19 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm --log-level='quiet' env | source +if test (fnm install v8.11.3) != "" + echo 'Expected fnm install to be "", Got: '(fnm install v8.11.3) + exit 1 +end + +if test (fnm use v8.11.3) != "" + echo 'Expected fnm use to be "", Got: '(fnm use v8.11.3) + exit 1 +end + +if test (fnm alias v8.11.3 something) != "" + echo 'Expected fnm alias to be "", Got: '(fnm alias v8.11.3 something) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__log_level_quiet__PowerShell.snap b/tests/snapshots/e2e__feature_tests__log_level_quiet__PowerShell.snap new file mode 100644 index 0000000..3f80cb2 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__log_level_quiet__PowerShell.snap @@ -0,0 +1,20 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm --log-level='quiet' env | Out-String | Invoke-Expression +If ("$(fnm install v8.11.3)" -ne "") { + Write-Output ('Expected fnm install to be "", Got: ' + $(fnm install v8.11.3)) + exit 1 +} + +If ("$(fnm use v8.11.3)" -ne "") { + Write-Output ('Expected fnm use to be "", Got: ' + $(fnm use v8.11.3)) + exit 1 +} + +If ("$(fnm alias v8.11.3 something)" -ne "") { + Write-Output ('Expected fnm alias to be "", Got: ' + $(fnm alias v8.11.3 something)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__log_level_quiet__Zsh.snap b/tests/snapshots/e2e__feature_tests__log_level_quiet__Zsh.snap new file mode 100644 index 0000000..de451f8 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__log_level_quiet__Zsh.snap @@ -0,0 +1,20 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm --log-level='quiet' env)" +if [ "$(fnm install v8.11.3)" != "" ]; then + echo 'Expected fnm install to be "", Got: '"$(fnm install v8.11.3)" + exit 1 +fi + +if [ "$(fnm use v8.11.3)" != "" ]; then + echo 'Expected fnm use to be "", Got: '"$(fnm use v8.11.3)" + exit 1 +fi + +if [ "$(fnm alias v8.11.3 something)" != "" ]; then + echo 'Expected fnm alias to be "", Got: '"$(fnm alias v8.11.3 something)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__matching_dotfiles__Bash.snap b/tests/snapshots/e2e__feature_tests__matching_dotfiles__Bash.snap new file mode 100644 index 0000000..c664ba9 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__matching_dotfiles__Bash.snap @@ -0,0 +1,16 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +echo 11.10.0 > .nvmrc +echo 11.10.0 > .node-version +fnm install +fnm use +if [ "$(node -v)" != "v11.10.0" ]; then + echo 'Expected Node version to be "v11.10.0", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__matching_dotfiles__Fish.snap b/tests/snapshots/e2e__feature_tests__matching_dotfiles__Fish.snap new file mode 100644 index 0000000..a7e0e00 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__matching_dotfiles__Fish.snap @@ -0,0 +1,13 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +echo 11.10.0 > .nvmrc +echo 11.10.0 > .node-version +fnm install +fnm use +if test (node -v) != "v11.10.0" + echo 'Expected Node version to be "v11.10.0", Got: '(node -v) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__matching_dotfiles__PowerShell.snap b/tests/snapshots/e2e__feature_tests__matching_dotfiles__PowerShell.snap new file mode 100644 index 0000000..1ed3c99 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__matching_dotfiles__PowerShell.snap @@ -0,0 +1,14 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +echo '11.10.0' > '.nvmrc' +echo '11.10.0' > '.node-version' +fnm install +fnm use +If ("$(node -v)" -ne "v11.10.0") { + Write-Output ('Expected Node version to be "v11.10.0", Got: ' + $(node -v)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__matching_dotfiles__WinCmd.snap b/tests/snapshots/e2e__feature_tests__matching_dotfiles__WinCmd.snap new file mode 100644 index 0000000..1640dfa --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__matching_dotfiles__WinCmd.snap @@ -0,0 +1,14 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i +echo 11.10.0 > .nvmrc +echo 11.10.0 > .node-version +fnm install +fnm use +node -v | findstr v11.10.0 +if %errorlevel% neq 0 ( + echo Node version does not match "v11.10.0" + exit 1 +) diff --git a/tests/snapshots/e2e__feature_tests__matching_dotfiles__Zsh.snap b/tests/snapshots/e2e__feature_tests__matching_dotfiles__Zsh.snap new file mode 100644 index 0000000..b1c5936 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__matching_dotfiles__Zsh.snap @@ -0,0 +1,14 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +echo 11.10.0 > .nvmrc +echo 11.10.0 > .node-version +fnm install +fnm use +if [ "$(node -v)" != "v11.10.0" ]; then + echo 'Expected Node version to be "v11.10.0", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__multishell__Bash.snap b/tests/snapshots/e2e__feature_tests__multishell__Bash.snap new file mode 100644 index 0000000..a22659d --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__multishell__Bash.snap @@ -0,0 +1,25 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +fnm install v8.11.3 +fnm install v11.9.0 +fnm use v8.11.3 +echo 'set -e +shopt -s expand_aliases + +eval "$(fnm env)" +fnm use 11 +if [ "$(node -v)" '\!'= "v11.9.0" ]; then + echo '\''Expected Node version to be "v11.9.0", Got: '\''"$(node -v)" + exit 1 +fi +' | bash +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__multishell__Fish.snap b/tests/snapshots/e2e__feature_tests__multishell__Fish.snap new file mode 100644 index 0000000..3da9489 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__multishell__Fish.snap @@ -0,0 +1,20 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +fnm install v8.11.3 +fnm install v11.9.0 +fnm use v8.11.3 +fish -c ' +fnm env | source +fnm use 11 +if test (node -v) '\!'= "v11.9.0" + echo '\''Expected Node version to be "v11.9.0", Got: '\''(node -v) + exit 1 +end +' +if test (node -v) != "v8.11.3" + echo 'Expected Node version to be "v8.11.3", Got: '(node -v) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__multishell__PowerShell.snap b/tests/snapshots/e2e__feature_tests__multishell__PowerShell.snap new file mode 100644 index 0000000..617a04c --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__multishell__PowerShell.snap @@ -0,0 +1,21 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install v8.11.3 +fnm install v11.9.0 +fnm use v8.11.3 +echo '$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm use 11 +If ("$(node -v)" -ne "v11.9.0") { + Write-Output (''Expected Node version to be "v11.9.0", Got: '' + $(node -v)) + exit 1 +} +' | powershell -NoProfile +If ("$(node -v)" -ne "v8.11.3") { + Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__multishell__Zsh.snap b/tests/snapshots/e2e__feature_tests__multishell__Zsh.snap new file mode 100644 index 0000000..6b8bbff --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__multishell__Zsh.snap @@ -0,0 +1,21 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +fnm install v8.11.3 +fnm install v11.9.0 +fnm use v8.11.3 +echo 'set -e +eval "$(fnm env)" +fnm use 11 +if [ "$(node -v)" '\!'= "v11.9.0" ]; then + echo '\''Expected Node version to be "v11.9.0", Got: '\''"$(node -v)" + exit 1 +fi +' | zsh +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__nvmrc__Bash.snap b/tests/snapshots/e2e__feature_tests__nvmrc__Bash.snap new file mode 100644 index 0000000..7e349e4 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__nvmrc__Bash.snap @@ -0,0 +1,15 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +echo v8.11.3 > .nvmrc +fnm install +fnm use +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__nvmrc__Fish.snap b/tests/snapshots/e2e__feature_tests__nvmrc__Fish.snap new file mode 100644 index 0000000..f7cb7cb --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__nvmrc__Fish.snap @@ -0,0 +1,12 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +echo v8.11.3 > .nvmrc +fnm install +fnm use +if test (node -v) != "v8.11.3" + echo 'Expected Node version to be "v8.11.3", Got: '(node -v) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__nvmrc__PowerShell.snap b/tests/snapshots/e2e__feature_tests__nvmrc__PowerShell.snap new file mode 100644 index 0000000..4932570 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__nvmrc__PowerShell.snap @@ -0,0 +1,13 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +echo 'v8.11.3' > '.nvmrc' +fnm install +fnm use +If ("$(node -v)" -ne "v8.11.3") { + Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__nvmrc__WinCmd.snap b/tests/snapshots/e2e__feature_tests__nvmrc__WinCmd.snap new file mode 100644 index 0000000..8561918 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__nvmrc__WinCmd.snap @@ -0,0 +1,13 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i +echo v8.11.3 > .nvmrc +fnm install +fnm use +node -v | findstr v8.11.3 +if %errorlevel% neq 0 ( + echo Node version does not match "v8.11.3" + exit 1 +) diff --git a/tests/snapshots/e2e__feature_tests__nvmrc__Zsh.snap b/tests/snapshots/e2e__feature_tests__nvmrc__Zsh.snap new file mode 100644 index 0000000..afe254f --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__nvmrc__Zsh.snap @@ -0,0 +1,13 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +echo v8.11.3 > .nvmrc +fnm install +fnm use +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__partial_semver__Bash.snap b/tests/snapshots/e2e__feature_tests__partial_semver__Bash.snap new file mode 100644 index 0000000..3eb9820 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__partial_semver__Bash.snap @@ -0,0 +1,14 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +fnm install 6 +fnm use 6 +if [ "$(node -v)" != "v6.17.1" ]; then + echo 'Expected Node version to be "v6.17.1", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__partial_semver__Fish.snap b/tests/snapshots/e2e__feature_tests__partial_semver__Fish.snap new file mode 100644 index 0000000..b79487b --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__partial_semver__Fish.snap @@ -0,0 +1,11 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +fnm install 6 +fnm use 6 +if test (node -v) != "v6.17.1" + echo 'Expected Node version to be "v6.17.1", Got: '(node -v) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__partial_semver__PowerShell.snap b/tests/snapshots/e2e__feature_tests__partial_semver__PowerShell.snap new file mode 100644 index 0000000..f98996c --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__partial_semver__PowerShell.snap @@ -0,0 +1,12 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install 6 +fnm use 6 +If ("$(node -v)" -ne "v6.17.1") { + Write-Output ('Expected Node version to be "v6.17.1", Got: ' + $(node -v)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__partial_semver__WinCmd.snap b/tests/snapshots/e2e__feature_tests__partial_semver__WinCmd.snap new file mode 100644 index 0000000..89784ea --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__partial_semver__WinCmd.snap @@ -0,0 +1,12 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i +fnm install 6 +fnm use 6 +node -v | findstr v6.17.1 +if %errorlevel% neq 0 ( + echo Node version does not match "v6.17.1" + exit 1 +) diff --git a/tests/snapshots/e2e__feature_tests__partial_semver__Zsh.snap b/tests/snapshots/e2e__feature_tests__partial_semver__Zsh.snap new file mode 100644 index 0000000..157bee0 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__partial_semver__Zsh.snap @@ -0,0 +1,12 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +fnm install 6 +fnm use 6 +if [ "$(node -v)" != "v6.17.1" ]; then + echo 'Expected Node version to be "v6.17.1", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__system_node__Bash.snap b/tests/snapshots/e2e__feature_tests__system_node__Bash.snap new file mode 100644 index 0000000..bcf1517 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__system_node__Bash.snap @@ -0,0 +1,15 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +fnm install 10 +fnm use 10 +fnm use system +if [ "$(node -v)" != "custom node" ]; then + echo 'Expected Node version to be "custom node", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__system_node__Fish.snap b/tests/snapshots/e2e__feature_tests__system_node__Fish.snap new file mode 100644 index 0000000..c4c091a --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__system_node__Fish.snap @@ -0,0 +1,12 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +fnm install 10 +fnm use 10 +fnm use system +if test (node -v) != "custom node" + echo 'Expected Node version to be "custom node", Got: '(node -v) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__system_node__PowerShell.snap b/tests/snapshots/e2e__feature_tests__system_node__PowerShell.snap new file mode 100644 index 0000000..6946343 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__system_node__PowerShell.snap @@ -0,0 +1,13 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install 10 +fnm use 10 +fnm use system +If ("$(node -v)" -ne "custom node") { + Write-Output ('Expected Node version to be "custom node", Got: ' + $(node -v)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__system_node__Zsh.snap b/tests/snapshots/e2e__feature_tests__system_node__Zsh.snap new file mode 100644 index 0000000..58bdf12 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__system_node__Zsh.snap @@ -0,0 +1,13 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +fnm install 10 +fnm use 10 +fnm use system +if [ "$(node -v)" != "custom node" ]; then + echo 'Expected Node version to be "custom node", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Bash.snap b/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Bash.snap new file mode 100644 index 0000000..48b81eb --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Bash.snap @@ -0,0 +1,12 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env)" +echo lts/dubnium > .nvmrc +fnm install +fnm use +fnm ls | grep lts-dubnium diff --git a/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Fish.snap b/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Fish.snap new file mode 100644 index 0000000..c04f469 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Fish.snap @@ -0,0 +1,9 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env | source +echo lts/dubnium > .nvmrc +fnm install +fnm use +fnm ls | grep lts-dubnium diff --git a/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__PowerShell.snap b/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__PowerShell.snap new file mode 100644 index 0000000..75e9577 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__PowerShell.snap @@ -0,0 +1,10 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +echo 'lts/dubnium' > '.nvmrc' +fnm install +fnm use +$($__out__ = $(fnm ls | Select-String 'lts-dubnium'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Zsh.snap b/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Zsh.snap new file mode 100644 index 0000000..d531fc6 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Zsh.snap @@ -0,0 +1,10 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env)" +echo lts/dubnium > .nvmrc +fnm install +fnm use +fnm ls | grep lts-dubnium diff --git a/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Bash.snap b/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Bash.snap new file mode 100644 index 0000000..4e896e7 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Bash.snap @@ -0,0 +1,16 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env --use-on-cd)" +mkdir inner_path +echo v8.11.3 > inner_path/.node-version +fnm install v8.11.3 +cd inner_path +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Fish.snap b/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Fish.snap new file mode 100644 index 0000000..9c9e965 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Fish.snap @@ -0,0 +1,13 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env --use-on-cd | source +mkdir inner_path +echo v8.11.3 > inner_path/.node-version +fnm install v8.11.3 +cd inner_path +if test (node -v) != "v8.11.3" + echo 'Expected Node version to be "v8.11.3", Got: '(node -v) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__PowerShell.snap b/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__PowerShell.snap new file mode 100644 index 0000000..23036d2 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__PowerShell.snap @@ -0,0 +1,14 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env --use-on-cd | Out-String | Invoke-Expression +mkdir inner_path +echo 'v8.11.3' > 'inner_path/.node-version' +fnm install v8.11.3 +cd inner_path +If ("$(node -v)" -ne "v8.11.3") { + Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Zsh.snap b/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Zsh.snap new file mode 100644 index 0000000..d7514ec --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Zsh.snap @@ -0,0 +1,14 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env --use-on-cd)" +mkdir inner_path +echo v8.11.3 > inner_path/.node-version +fnm install v8.11.3 +cd inner_path +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Bash.snap b/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Bash.snap new file mode 100644 index 0000000..44fd616 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Bash.snap @@ -0,0 +1,16 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +shopt -s expand_aliases + +eval "$(fnm env --use-on-cd)" +mkdir inner_path +echo v8.11.3 > inner_path/.nvmrc +fnm install v8.11.3 +cd inner_path +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi diff --git a/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Fish.snap b/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Fish.snap new file mode 100644 index 0000000..aad559b --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Fish.snap @@ -0,0 +1,13 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +fnm env --use-on-cd | source +mkdir inner_path +echo v8.11.3 > inner_path/.nvmrc +fnm install v8.11.3 +cd inner_path +if test (node -v) != "v8.11.3" + echo 'Expected Node version to be "v8.11.3", Got: '(node -v) + exit 1 +end diff --git a/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__PowerShell.snap b/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__PowerShell.snap new file mode 100644 index 0000000..5a31d6c --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__PowerShell.snap @@ -0,0 +1,14 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +$ErrorActionPreference = "Stop" +fnm env --use-on-cd | Out-String | Invoke-Expression +mkdir inner_path +echo 'v8.11.3' > 'inner_path/.nvmrc' +fnm install v8.11.3 +cd inner_path +If ("$(node -v)" -ne "v8.11.3") { + Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) + exit 1 +} diff --git a/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Zsh.snap b/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Zsh.snap new file mode 100644 index 0000000..4e05c36 --- /dev/null +++ b/tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Zsh.snap @@ -0,0 +1,14 @@ +--- +source: tests/e2e.rs +expression: "&source.trim()" +--- +set -e +eval "$(fnm env --use-on-cd)" +mkdir inner_path +echo v8.11.3 > inner_path/.nvmrc +fnm install v8.11.3 +cd inner_path +if [ "$(node -v)" != "v8.11.3" ]; then + echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" + exit 1 +fi