defmodule Mix.SkillKit.Dotenv do @moduledoc false # Internal dev-tooling helper shared by the SkillKit mix tasks. # # Loads KEY=value pairs from a project-root `.env` into the process # environment. Lines starting with `#` are ignored. Existing env vars # take precedence (so a shell export can override the file). This is a # convenience for running tasks locally, not a public configuration # surface — apps should manage their own environment. @doc "Loads `.env` (or `path`) into the process environment." def load(path \\ ".env") do case File.read(path) do {:ok, content} -> apply_env(content) {:error, _} -> :ok end end defp apply_env(content) do content |> String.split("\n") |> Enum.each(&put_line/1) end defp put_line(line), do: put_kv(String.trim(line)) defp put_kv(""), do: :ok defp put_kv("#" <> _), do: :ok defp put_kv(line) do case String.split(line, "=", parts: 2) do [key, value] -> put_if_missing(String.trim(key), unquote_value(value)) _ -> :ok end end defp put_if_missing(key, value) do case System.get_env(key) do nil -> System.put_env(key, value) _existing -> :ok end end defp unquote_value(value), do: strip_quotes(String.trim(value)) defp strip_quotes(<>), do: String.trim_trailing(rest, ~s(")) defp strip_quotes(<>), do: String.trim_trailing(rest, "'") defp strip_quotes(value), do: value end