Current section

Files

Jump to
refine mix.exs
Raw

mix.exs

defmodule Refine.MixProject do
  use Mix.Project

  @source_url "https://codeberg.org/ArthurClemens/refine"

  def project do
    [
      app: :refine,
      name: "Refine",
      version: "0.5.0",
      elixir: "~> 1.17",
      description:
        "Refine is an Elixir library for implementing fast faceted search.",
      start_permanent: Mix.env() == :prod,
      elixirc_paths: elixirc_paths(Mix.env()),
      aliases: aliases(),
      deps: deps(),
      docs: docs(),
      package: package(),
      dialyzer: [plt_add_apps: [:mix, :ex_unit]],
      test_pattern: "*_test.{exs}",
      test_coverage: [tool: ExCoveralls],
      preferred_cli_env: [
        "coveralls.detail": :test,
        coveralls: :test
      ]
    ]
  end

  defp elixirc_paths(:test),
    do: ["lib", "test/support"]

  defp elixirc_paths(:dev),
    do: ["lib", "test/support"]

  defp elixirc_paths(:bench),
    do: ["lib", "benchmark"]

  defp elixirc_paths(_), do: ["lib"]

  defp deps do
    [
      {:ecto_sql, "~> 3.11"},
      {:flop, "~> 0.26", optional: true},
      {:jason, "~> 1.4"},
      {:nimble_options, "~> 1.0"},
      {:postgrex, "~> 0.22.4"},
      {:sublimate, "== 0.1.7"},
      # dev / test
      {:benchee, "~> 1.3", only: :bench},
      {:credo, "~> 1.7", only: [:dev, :test], runtime: false},
      {:dialyxir, "~> 1.4", only: [:dev], runtime: false},
      {:ex_doc, "~> 0.40", only: :dev, runtime: false},
      {:excoveralls, "~> 0.18", only: :test},
      {:recode, "~> 0.7", only: [:dev, :test], runtime: false},
      {:sobelow, "~> 0.15", only: [:dev, :test], runtime: false}
    ]
  end

  defp docs do
    [
      main: "introduction",
      api_reference: false,
      extras: [
        "doc_pages/introduction.md",
        "doc_pages/installation.md",
        "doc_pages/facets_table.md",
        "doc_pages/configuration.md",
        "doc_pages/facets_configuration.md",
        "doc_pages/joins_configuration.md",
        "doc_pages/faceted_search.md",
        "doc_pages/flop_adapter.md",
        "doc_pages/testing.md",
        "CHANGELOG.md",
        "CONTRIBUTING.md"
      ],
      groups_for_docs: [
        Facets: &(&1[:group] == :facets_table),
        Search: &(&1[:group] == :search),
        Helpers: &(&1[:group] == :helpers)
      ],
      before_closing_body_tag: &before_closing_body_tag/1
    ]
  end

  defp package do
    [
      licenses: ["MIT"],
      links: %{
        "Codeberg" => @source_url,
        "Changelog" => @source_url <> "/src/branch/main/CHANGELOG.md"
      },
      files: ~w(lib mix.exs README* LICENSE* CHANGELOG*)
    ]
  end

  defp aliases do
    [
      # Quality checks
      qa: [
        "typecheck",
        "deps.clean --unlock --unused",
        "format",
        "format --check-formatted",
        "compile",
        "docs",
        "sobelow --config",
        "credo --strict"
      ],
      prepublish: "cmd ./scripts/prepublish.sh",
      typecheck: "dialyzer --format dialyzer",
      # Development tasks
      init_dev_repo: ["ecto.create --repo Refine.Dev.Repo"],
      destroy_dev_repo: ["ecto.drop --force-drop --repo Refine.Dev.Repo"],
      # Test tasks
      ## Call with MIX_ENV=test
      init_test_repo: ["ecto.create --quiet --repo Refine.Test.Repo"],
      destroy_test_repo: [
        "ecto.drop --quiet --force-drop --repo Refine.Test.Repo"
      ],
      # Benchmark tasks
      ## Run with: MIX_ENV=bench mix init_bench_repo
      init_bench_repo: ["ecto.create --quiet --repo Refine.Bench.Repo"],
      ## Run with: MIX_ENV=bench mix destroy_bench_repo
      destroy_bench_repo: [
        "ecto.drop --quiet --force-drop --repo Refine.Bench.Repo"
      ]
      ## Test coverage:
      ## mix test --cover
      ## mix coveralls.detail
    ]
  end

  defp before_closing_body_tag(_) do
    """
    <script src="https://cdn.jsdelivr.net/npm/mermaid@11.12.2/dist/mermaid.min.js"></script>
    <script>
      let initialized = false;

      window.addEventListener("exdoc:loaded", () => {
        if (!initialized) {
          mermaid.initialize({
            startOnLoad: false,
            theme: document.body.className.includes("dark") ? "dark" : "default"
          });
          initialized = true;
        }

        let id = 0;
        for (const codeEl of document.querySelectorAll("pre code.mermaid")) {
          const preEl = codeEl.parentElement;
          const graphDefinition = codeEl.textContent;
          const graphEl = document.createElement("div");
          const graphId = "mermaid-graph-" + id++;
          mermaid.render(graphId, graphDefinition).then(({svg, bindFunctions}) => {
            graphEl.innerHTML = svg;
            bindFunctions?.(graphEl);
            preEl.insertAdjacentElement("afterend", graphEl);
            preEl.remove();
          });
        }
      });
    </script>
    """
  end
end