source_env() {
  if [[ -f $ZSH_DOTENV_FILE ]]; then
    if [ "$ZSH_DOTENV_PROMPT" != "false" ]; then
      # confirm before sourcing file
      local confirmation
      # print same-line prompt and output newline character if necessary
      echo -n "dotenv: source '$ZSH_DOTENV_FILE' file in the directory? (Y/n) "
      read -k 1 confirmation; [[ "$confirmation" != $'\n' ]] && echo
      # only bail out if confirmation character is n
      if [[ "$confirmation" = [nN] ]]; then
        return
      fi
    fi

    # test .env syntax
    zsh -fn $ZSH_DOTENV_FILE || echo "dotenv: error when sourcing '$ZSH_DOTENV_FILE' file" >&2

    if [[ -o a ]]; then
      source $ZSH_DOTENV_FILE
    else
      set -a
      source $ZSH_DOTENV_FILE
      set +a
    fi
  fi
}

autoload -U add-zsh-hook
add-zsh-hook chpwd source_env

if [[ -z $ZSH_DOTENV_FILE ]]; then
    ZSH_DOTENV_FILE=.env
fi

source_env