distributable:
  url: https://github.com/denoland/deno/archive/refs/tags/v{{ version }}.tar.gz
  strip-components: 1

versions:
  github: denoland/deno

provides:
  - bin/deno

interprets:
  # extensions: [ts, js] # nodejs.org for now
  extensions: ts
  args: [deno, run]

runtime:
  env:
    DENO_NO_UPDATE_CHECK: 'true'
    DENORT_BIN: '{{prefix}}/bin/denort'

build:
  script:
    - |
      rust_version=$(yq -er .toolchain.channel rust-toolchain.toml)
      if semverator lt "$rust_version" 1.67.0; then
        # older versions of rustc --print=split-debuginfo fails with:
        # error: unknown print request `split-debuginfo`
        # maybe due to newer cargo?
        rust_version=1.67.0
      fi
      set -o allexport
      source <(pkgx "+rust-lang.org~${rust_version}" +rust-lang.org/cargo^0)
      set +o allexport
      unset rust_version

    # https://github.com/denoland/deno/issues/15596 -- reported fixed in 1.25.3
    - run: |
        find ext/ffi/tinycc -maxdepth 0 -empty -exec \
          git clone https://github.com/TinyCC/tinycc.git {} \;

        if test "{{hw.platform}}+{{ hw.arch }}" = "darwin+x86-64"; then
          # our LLVM cannot build with deployment target set to 10.6
          sed -i.bak s/MACOSX_DEPLOYMENT_TARGET/\#/ ext/ffi/tinycc/Makefile
        fi
      if: '>=1.25.0<1.25.4'

    # change default bindir to ~/.local/bin per our conventions
    - sed -i'' -e 's/home_path.push(".deno")/home_path.push(".local")/' cli/tools/installer.rs

    - grep home_path cli/tools/installer.rs

    # curve25519-dalek 4.1.2 introduces some odd simd issues on x86-64 on Rust <1.78 (unreleased)
    - run: sed -i
        -e 's/version = "4.1.2"/version = "4.1.1"/'
        -e 's/0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348/e89b8c6a2e4b1f45971ad09761aafb85514a84744b67a95e32c3cc1352d1f65c/'
        Cargo.lock

    # 1.43.0 published as 1.43.1
    - run: sed -i 's/^version = .*/version = "{{version}}"/' cli/Cargo.toml

    - cargo install --locked --path cli --root "{{ prefix }}"
  dependencies:
    darwin:
      llvm.org: '*'
    # rust-lang.org: various
    git-scm.org: 2 # to build tinycc
    curl.se: '*' # required to download v8 (python is another option)
    cmake.org: ^3 # deno.land>=1.36.1 requires cmake
    protobuf.dev: '*' # deno.land>=1.36.4 requires protoc
    github.com/mikefarah/yq: ^4
    crates.io/semverator: ^0

test:
  dependencies:
    gnu.org/coreutils: '*' # for stat and numfmt
  script:
    - deno --version | grep {{version}}
    - mv $FIXTURE test.ts
    - deno install -f test.ts
    - test "$($HOME/.local/bin/test)" = "Hello, world!"
    - deno compile test.ts
    - test "$(./test)" = "Hello, world!"
    # human readable size of ./test should be equal to the size of denort to ensure our denort is being used
    - run: test "$(stat -c %s ./test | numfmt --to=iec-i)" = "$(stat -c %s "{{prefix}}/bin/denort" | numfmt --to=iec-i)"
      if: '>=1.40.5'
    # tests download of dependencies
    - deno eval 'import { VERSION } from "https://deno.land/std@0.221.0/version.ts"; console.log(VERSION);' | tee /dev/stderr | grep -q ^0.221.0$
    # ensure we haven't linked libunwind
    - if $LIST_LIBS {{prefix}}/bin/deno | grep libunwind; then false; fi
  fixture: |
    console.log("Hello, world!");
  env:
    darwin:
      LIST_LIBS: otool -l
    linux:
      LIST_LIBS: ldd
