Skip to main content

mix.exs

defmodule Coffrify.MixProject do
  @moduledoc """
  Mix project definition for the official Coffrify Elixir SDK.

  Coffrify is an encrypted file-transfer infrastructure (https://coffrify.com).
  This SDK is the canonical Elixir client and mirrors the JavaScript SDK
  (`@coffrify/sdk`) feature-for-feature: 35 resources, signed webhooks,
  retry policies, circuit breaker, client-side rate limiter, idempotency
  store, telemetry, and Phoenix/Plug integration helpers.
  """

  use Mix.Project

  @version "0.9.0"
  @source_url "https://github.com/coffrify/coffrify-elixir"

  def project do
    [
      app: :coffrify,
      version: @version,
      elixir: "~> 1.15",
      elixirc_paths: elixirc_paths(Mix.env()),
      start_permanent: Mix.env() == :prod,
      consolidate_protocols: Mix.env() != :test,
      deps: deps(),
      description: description(),
      package: package(),
      docs: docs(),
      name: "Coffrify",
      source_url: @source_url,
      homepage_url: "https://coffrify.com",
      aliases: aliases()
    ]
  end

  def application do
    [
      extra_applications: [:logger, :crypto, :inets, :ssl]
    ]
  end

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

  defp deps do
    [
      # HTTP client — battle-tested, fetch-like ergonomics
      {:req, "~> 0.5"},
      # JSON encode/decode
      {:jason, "~> 1.4"},
      # Validated option schemas for public APIs
      {:nimble_options, "~> 1.0"},
      # Telemetry events — :coffrify, :request | :retry | :webhook
      {:telemetry, "~> 1.2"},

      # Optional adapters (left for the host application to install)
      {:plug, "~> 1.16", optional: true},
      {:phoenix, "~> 1.7", optional: true},
      {:opentelemetry_api, "~> 1.3", optional: true},
      {:redix, "~> 1.5", optional: true},

      # Tooling
      {:ex_doc, "~> 0.34", only: :dev, runtime: false},
      {:credo, "~> 1.7", only: [:dev, :test], runtime: false},
      {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false},
      {:bypass, "~> 2.1", only: :test}
    ]
  end

  defp description do
    # hex.pm impose une description <= 300 caractères (et pas de tiret long).
    "Official Elixir SDK for Coffrify, encrypted file-transfer infrastructure: " <>
      "transfers, webhooks (Standard Webhooks v2), API keys, audit, vaults and " <>
      "30+ resources, with retry policies, circuit breaker, rate limiter, " <>
      "idempotency and Phoenix/Plug helpers."
  end

  defp package do
    [
      name: "coffrify",
      maintainers: ["Coffrify"],
      licenses: ["MIT"],
      links: %{
        "GitHub" => @source_url,
        "Coffrify" => "https://coffrify.com",
        "API Reference" => "https://docs.coffrify.com/api",
        "Changelog" => "#{@source_url}/blob/main/CHANGELOG.md"
      },
      files:
        ~w(lib config mix.exs README.md LICENSE) ++
          ~w(.formatter.exs)
    ]
  end

  defp docs do
    [
      main: "Coffrify",
      source_ref: "v#{@version}",
      source_url: @source_url,
      formatters: ["html"],
      groups_for_modules: [
        "Core": [
          Coffrify,
          Coffrify.Client,
          Coffrify.Error
        ],
        "Resources": [
          Coffrify.Resources.Transfers,
          Coffrify.Resources.Webhooks,
          Coffrify.Resources.ApiKeys,
          Coffrify.Resources.Audit,
          Coffrify.Resources.Analytics,
          Coffrify.Resources.Branding,
          Coffrify.Resources.Domains,
          Coffrify.Resources.Folders,
          Coffrify.Resources.Collections,
          Coffrify.Resources.Members,
          Coffrify.Resources.Notifications,
          Coffrify.Resources.Gdpr,
          Coffrify.Resources.Sessions,
          Coffrify.Resources.Downloads,
          Coffrify.Resources.Alerts,
          Coffrify.Resources.ApiTokens,
          Coffrify.Resources.Templates,
          Coffrify.Resources.Requests,
          Coffrify.Resources.Coffres,
          Coffrify.Resources.MagicLinks,
          Coffrify.Resources.Quotas,
          Coffrify.Resources.Billing,
          Coffrify.Resources.Status,
          Coffrify.Resources.Changelog,
          Coffrify.Resources.Recipients,
          Coffrify.Resources.Rooms,
          Coffrify.Resources.Mfa,
          Coffrify.Resources.Marketing,
          Coffrify.Resources.GdprExtra,
          Coffrify.Resources.Sso,
          Coffrify.Resources.Scim,
          Coffrify.Resources.WebhookExtras,
          Coffrify.Resources.WorkspaceExtras
        ],
        "Webhooks": [
          Coffrify.Webhook.Verification,
          Coffrify.Webhook.EventCatalog
        ],
        "Runtime": [
          Coffrify.Runtime.Retry,
          Coffrify.Runtime.Retry.Policy,
          Coffrify.Runtime.Retry.ExponentialBackoff,
          Coffrify.Runtime.Retry.DecorrelatedJitter,
          Coffrify.Runtime.Retry.FibonacciBackoff,
          Coffrify.Runtime.Retry.FixedDelay,
          Coffrify.Runtime.CircuitBreaker,
          Coffrify.Runtime.RateLimit,
          Coffrify.Runtime.RateLimit.TokenBucket,
          Coffrify.Runtime.RateLimit.LeakyBucket,
          Coffrify.Runtime.Paginate,
          Coffrify.Runtime.Telemetry,
          Coffrify.Runtime.Idempotency,
          Coffrify.Runtime.Idempotency.Memory,
          Coffrify.Runtime.Idempotency.Redis,
          Coffrify.Runtime.WebhookReplay,
          Coffrify.Runtime.WebhookReplay.Memory,
          Coffrify.Runtime.WebhookReplay.Redis
        ],
        "Phoenix / Plug": [
          Coffrify.Plug.VerifyWebhook,
          Coffrify.Phoenix.WebhookController
        ],
        "Testing": [
          Coffrify.Testing,
          Coffrify.Testing.Fixtures
        ]
      ]
    ]
  end

  defp aliases do
    [
      check: ["format --check-formatted", "credo --strict", "dialyzer"]
    ]
  end
end