defmodule Framework.MixProject do use Mix.Project @version "0.4.12" @source_url "https://github.com/your-org/framework" def project do [ app: :framework, version: @version, elixir: "~> 1.18", start_permanent: Mix.env() == :prod, deps: deps(), # Hex metadata description: "Production-ready Elixir framework with type-safe navigation, event-driven architecture, and comprehensive observability", package: package(), # Documentation name: "Framework", source_url: @source_url, docs: docs(), # Testing test_coverage: [tool: ExCoveralls], preferred_cli_env: [ coveralls: :test, "coveralls.detail": :test, "coveralls.post": :test, "coveralls.html": :test ], # Dialyzer configuration dialyzer: [ # Exclude dev-time Credo rules from analysis (API version conflicts) ignore_warnings: ".dialyzer_ignore.exs", plt_add_apps: [:mix] ] ] end def application do [ extra_applications: [:logger, :crypto, :ssl, :inets, :swoosh], mod: {Framework.Application, []} ] end defp deps do [ # Core dependencies - Data & transactions {:ecto, "~> 3.11"}, {:ecto_sql, "~> 3.11"}, {:postgrex, "~> 0.18"}, {:ecto_psql_extras, "~> 0.7"}, # Effects & external I/O {:oban, "~> 2.17"}, {:req, "~> 0.5"}, {:finch, "~> 0.18"}, {:swoosh, "~> 1.16"}, # Events, contracts & APIs {:jason, "~> 1.4"}, {:ex_json_schema, "~> 0.10"}, {:protox, "~> 1.7"}, {:grpcbox, "~> 0.17"}, {:open_api_spex, "~> 3.6"}, {:phoenix_pubsub, "~> 2.1"}, # Observability {:telemetry, "~> 1.0"}, {:opentelemetry, "~> 1.4"}, {:opentelemetry_exporter, "~> 1.7"}, {:opentelemetry_phoenix, "~> 1.2"}, {:opentelemetry_ecto, "~> 1.2"}, {:opentelemetry_oban, "~> 1.0"}, {:logger_json, "~> 6.0"}, # Configuration & validation {:nimble_options, "~> 1.1"}, # Development & testing dependencies {:credo, "~> 1.7", only: [:dev, :test], runtime: false}, {:sobelow, "~> 0.13", only: [:dev, :test], runtime: false}, {:dialyxir, "~> 1.4", only: [:dev], runtime: false}, {:ex_doc, "~> 0.31", only: :dev, runtime: false}, {:mox, "~> 1.1", only: :test}, {:bypass, "~> 2.1", only: :test}, {:stream_data, "~> 1.0", only: [:dev, :test]}, {:excoveralls, "~> 0.18", only: [:dev, :test]}, {:mix_test_watch, "~> 1.0", only: [:dev, :test], runtime: false} ] end defp package do [ maintainers: ["Framework Team"], licenses: ["MIT"], links: %{"GitHub" => @source_url}, files: [ "lib", "priv", "ci", "mix.exs", "CHANGELOG.md", "LICENSE" ] ] end defp docs do [ main: "Framework", source_ref: "v#{@version}", source_url: @source_url, extras: ["CHANGELOG.md"], groups_for_modules: [ Core: [ Framework, Framework.Kernel, Framework.Transaction, Framework.Sequencer ], "Effects & I/O": [ Framework.Effects, Framework.Effects.Worker ], "Navigation & Security": [ Framework.AppSpec, Framework.VerifiedRoutes, Framework.MessageSecurity ], "Data Layer": [ Framework.SchemaRegistry, Framework.ConsumerCursor ], Observability: [ Framework.Telemetry, Framework.ValidationMetrics, Framework.OverlayController, Framework.OverlayRouter ], "Overlay Tools": [ Framework.Overlay.Timeline, Framework.Overlay.OutboxBrowser, Framework.Overlay.DLQBrowser, Framework.Overlay.ReplayHarness, Framework.Overlay.GatedExport, Framework.Overlay.SupersedenceVisualizer, Framework.Overlay.RedactionService, Framework.Overlay.StructuredLogger ], "Code Quality": [ Framework.Credo.Rules.NoRawRoutes, Framework.Credo.Rules.NoDirectNavigation, Framework.Credo.Rules.NoStringUrls, Framework.Credo.Rules.NoIOInPlan, Framework.Credo.Rules.NoRepoInPlan, Framework.Credo.Rules.NoTimeInPlan, Framework.Credo.Rules.NoRngInPlan, Framework.Credo.Rules.NoIsolationOverride, Framework.Credo.Rules.RequireOnConflict, Framework.Credo.Rules.RequireBoundedList, Framework.Credo.Rules.NoUpdateAll ], "Mix Tasks": [ Mix.Tasks.Framework.Gen.Migrations ] ] ] end end