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