defmodule BankingCircle.MixProject do use Mix.Project @version "1.0.0" @source_url "https://github.com/iamkanishka/banking_circle" def project do [ app: :banking_circle, version: @version, elixir: "~> 1.16", start_permanent: Mix.env() == :prod, elixirc_paths: elixirc_paths(Mix.env()), deps: deps(), package: package(), description: description(), source_url: @source_url, homepage_url: @source_url, docs: docs(), aliases: aliases(), dialyzer: [ plt_file: {:no_warn, "priv/plts/dialyzer.plt"}, plt_add_apps: [:mix, :ex_unit], flags: [:error_handling, :underspecs, :unmatched_returns] ], test_coverage: [tool: ExCoveralls], preferred_cli_env: [ coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test ] ] end def application do [ extra_applications: [:logger, :crypto], mod: {BankingCircle.Application, []} ] end defp elixirc_paths(:test), do: ["lib", "test/support"] defp elixirc_paths(_), do: ["lib"] defp deps do [ # HTTP client — Req is the modern standard (built on Finch/Mint), # chosen over Tesla/HTTPoison per current Elixir ecosystem best practice. {:req, "~> 0.5"}, # JSON {:jason, "~> 1.4"}, # Request/response schema validation without a database (embedded schemas). {:ecto, "~> 3.12"}, # Retry/backoff primitives layered on top of our own middleware. {:telemetry, "~> 1.2"}, # Config validation at boot (NimbleOptions is the ecosystem standard here). {:nimble_options, "~> 1.1"}, # WebSocket client for FX streaming quotes (BankingCircle.FX.Stream). {:websockex, "~> 0.4.3"}, # Dev / test only {:bypass, "~> 2.1", only: :test}, {:mox, "~> 1.1", only: :test}, {:excoveralls, "~> 0.18", only: :test}, {:ex_doc, "~> 0.34", only: :dev, runtime: false}, {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, {:mix_audit, "~> 2.1", only: [:dev, :test], runtime: false}, {:styler, "~> 1.2", only: [:dev, :test], runtime: false} ] end defp description do """ A complete, production-grade Elixir client for the Banking Circle Connect API — payments (single & bulk), accounts, webhooks (AES-256-GCM verified), OAuth2/JWT auth with automatic token refresh, idempotency, retries, and telemetry. """ end defp package do [ name: "banking_circle", maintainers: ["Kanishka"], licenses: ["MIT"], links: %{ "GitHub" => @source_url, "Banking Circle Connect Docs" => "https://docs.bankingcircleconnect.com" }, files: ~w(lib mix.exs README.md CHANGELOG.md LICENSE .formatter.exs) ] end defp docs do [ main: "readme", extras: ["README.md", "CHANGELOG.md"], groups_for_modules: [ Auth: [BankingCircle.Auth.TokenServer, BankingCircle.Auth.Token], HTTP: [ BankingCircle.HTTP.Client, BankingCircle.HTTP.Middleware.Retry, BankingCircle.HTTP.Middleware.RateLimit, BankingCircle.HTTP.Middleware.Idempotency ], Resources: [ BankingCircle.Payments, BankingCircle.Accounts, BankingCircle.VirtualAccounts, BankingCircle.Webhooks, BankingCircle.FX, BankingCircle.FX.Stream, BankingCircle.Reporting, BankingCircle.Cases, BankingCircle.Cases.RFI, BankingCircle.DirectDebit, BankingCircle.ISO20022 ], Schemas: [BankingCircle.Schemas.Payment, BankingCircle.Schemas.BulkPayment], Errors: [BankingCircle.Error] ] ] end defp aliases do [ setup: ["deps.get"], check: ["format --check-formatted", "credo --strict", "dialyzer", "test"], "test.watch": ["test --stale --listen-on-stdin"] ] end end