Skip to main content

mix.exs

defmodule ElixirPhpEmailValidator.MixProject do
  use Mix.Project

  # Managed automatically by release-please (see release-please-config.json).
  # Starts at 0.0.0; the first release PR cuts 0.1.0 from the commit history.
  # x-release-please-start-version
  @version "1.0.7"
  # x-release-please-end
  @source_url "https://github.com/DanielDent/elixir_php_email_validator"
  @author_url "https://danieldent.com"

  def project do
    [
      app: :elixir_php_email_validator,
      version: @version,
      elixir: "~> 1.15",
      start_permanent: Mix.env() == :prod,
      # corpus.exs under test/fixtures is data, not a test module. (This key is
      # honoured on Elixir >= 1.19 and harmlessly ignored on older versions,
      # where the default `*_test.exs` pattern already excludes fixtures.)
      test_ignore_filters: [~r{test/fixtures/}],
      deps: deps(),
      aliases: aliases(),
      name: "ElixirPhpEmailValidator",
      description: description(),
      package: package(),
      docs: docs(),
      source_url: @source_url,
      dialyzer: [
        plt_local_path: "priv/plts",
        plt_core_path: "priv/plts",
        # The Mix tasks call Mix.* (Mix isn't in the default PLT).
        plt_add_apps: [:mix],
        # Verify specs are accurate (catches over/under-specified contracts).
        flags: [:error_handling, :extra_return, :missing_return]
      ]
    ]
  end

  # The live/fuzz suite shells out to `php`; excluded unless you opt in (CI and
  # `mix php.test` include it). Plain `mix test` runs everywhere, asserting
  # parity against the committed golden verdict files.
  def cli do
    [preferred_envs: ["php.test": :test]]
  end

  def application do
    # The runtime library has no dependencies: checksums are computed at
    # compile time and the only work at runtime is :re + :persistent_term.
    # The dev Mix tasks start :inets/:ssl on demand themselves.
    [extra_applications: []]
  end

  defp description do
    "A bug-for-bug compatible port of PHP's filter_var($email, FILTER_VALIDATE_EMAIL). " <>
      "Returns the exact same true/false verdict as PHP, verified by differential tests " <>
      "against real PHP across a version matrix."
  end

  defp package do
    [
      # MIT covers the original Elixir code/tests/tooling/docs; PHP-3.01 covers the
      # vendored php-src material that ships in priv/php (logical_filters.c and the
      # regex bytes derived from it). Both SPDX ids render on hex.pm. The Michael
      # Rushton attribution the regex also carries is preserved in NOTICE.
      licenses: ["MIT", "PHP-3.01"],
      # priv/php ships the vendored PHP source: regexp{0,1}.full + MANIFEST.json
      # are read at compile time (required), and the .pattern/.c copies ride along
      # for provenance/audit (see the NOTICE and COMPATIBILITY guide).
      files:
        ~w(lib priv/php .formatter.exs mix.exs README.md COMPATIBILITY.md LICENSE NOTICE CHANGELOG.md),
      links: %{
        "GitHub" => @source_url,
        "Author" => @author_url,
        "Changelog" => @source_url <> "/blob/main/CHANGELOG.md",
        "PHP source (php_filter_validate_email)" =>
          "https://github.com/php/php-src/blob/PHP-8.5/ext/filter/logical_filters.c"
      }
    ]
  end

  defp docs do
    [
      main: "readme",
      authors: ["Daniel Dent (https://danieldent.com)"],
      extras: [
        "README.md",
        "COMPATIBILITY.md": [title: "Compatibility & Correctness"],
        "CHANGELOG.md": [title: "Changelog"],
        NOTICE: [title: "Attribution (NOTICE)"],
        LICENSE: [title: "License"]
      ],
      # @version is 0.0.0 until release-please cuts the first tag; point docs at
      # `main` until then so source links resolve.
      source_ref: if(@version == "0.0.0", do: "main", else: "v#{@version}"),
      source_url: @source_url
    ]
  end

  defp deps do
    # Zero runtime dependencies. Everything here is dev/test tooling.
    [
      # All :dev-only, so the `test` env stays dependency-free (the canary CI job
      # then exercises only the library on the newest Elixir/OTP).
      {:ex_doc, "~> 0.31", only: :dev, runtime: false},
      {:credo, "~> 1.7", only: :dev, runtime: false},
      {:dialyxir, "~> 1.4", only: :dev, runtime: false}
    ]
  end

  defp aliases do
    [
      # Regenerate the golden verdict file from your local `php`, then run the
      # full suite including the live/fuzz tests that shell out to PHP.
      "php.test": ["php.golden", "test --include php"],
      # The full local quality gate (mirrors the `quality` CI job).
      check: ["format --check-formatted", "credo --strict", "dialyzer", "test"]
    ]
  end
end