Skip to main content

mix.exs

defmodule RpcElixir.MixProject do
  use Mix.Project

  # Test-only: enables set-theoretic inference for our own fixtures so
  # `RpcElixir.Types.FromInferred` tests have signatures to read. Downstream
  # users who want the FromInferred backend must enable this in their own
  # `mix.exs` — compiler options don't propagate from a dependency.
  if Mix.env() == :test do
    Code.compiler_options(infer_signatures: true)
  end

  @version "0.0.1"
  @source_url "https://github.com/ostatni5/elixir-ts-rpc"

  def project do
    [
      app: :elixir_ts_rpc,
      version: @version,
      elixir: "~> 1.19",
      start_permanent: Mix.env() == :prod,
      elixirc_paths: elixirc_paths(Mix.env()),
      deps: deps(),
      dialyzer: dialyzer(),
      description:
        "Foundation for typed RPC procedures with TypeScript-compatible type resolution from @spec",
      package: package(),
      docs: docs(),
      source_url: @source_url
    ]
  end

  def application do
    [extra_applications: [:logger]]
  end

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

  # PLT lives under _build so CI can cache it per OTP/Elixir build.
  defp dialyzer do
    [
      plt_local_path: "_build/#{Mix.env()}/plt",
      plt_core_path: "_build/#{Mix.env()}/plt",
      # :mix is needed so the Mix.Task / Mix.Task.Compiler callbacks and the
      # Mix.* helper calls in our generator tasks are known to dialyzer.
      plt_add_apps: [:mix],
      ignore_warnings: ".dialyzer_ignore.exs"
    ]
  end

  defp deps do
    [
      {:plug, "~> 1.16"},
      # Optional: only needed by the `rpc.gen.ts.watch` task. Consumers who use
      # watch mode must add `:file_system` to their own deps.
      {:file_system, "~> 1.0", optional: true},
      {:ecto, "~> 3.13", only: :test},
      {:ex_json_schema, "~> 0.10", only: :test},
      {:ex_doc, "~> 0.34", only: :dev, runtime: false},
      {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false},
      {:credo, "~> 1.7", only: [:dev, :test], runtime: false}
    ]
  end

  # Publish from this directory: `cd apps/rpc_elixir && mix hex.publish`
  defp package do
    [
      name: "elixir_ts_rpc",
      licenses: ["MIT"],
      links: %{
        "GitHub" => "https://github.com/ostatni5/elixir-ts-rpc",
        "Guide" => "https://ostatni5.github.io/elixir-ts-rpc/"
      },
      files: ["lib", "mix.exs", "README.md", "LICENSE", "CHANGELOG.md", "docs"]
    ]
  end

  defp docs do
    [
      main: "readme",
      extras: ["README.md", "CHANGELOG.md", "docs/supported-types.md"],
      source_url: @source_url,
      source_ref: @version,
      # These live in Elixir core but are `@moduledoc false`, so ExDoc can't
      # link to them. They're still the clearest way to name the APIs we use.
      skip_code_autolink_to: [
        "Code.Typespec",
        "Code.Typespec.fetch_specs/1",
        "Code.Typespec.spec_to_quoted/2",
        "Module.Types.Descr"
      ]
    ]
  end
end