Packages

phoenix_kit

1.6.5
1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib mix tasks phoenix_kit.install.ex
Raw

lib/mix/tasks/phoenix_kit.install.ex

if Code.ensure_loaded?(Igniter.Mix.Task) do
defmodule Mix.Tasks.PhoenixKit.Install do
@moduledoc """
Igniter installer for PhoenixKit.
This task automatically installs PhoenixKit into a Phoenix application by:
1. Auto-detecting and configuring Ecto repo
2. Setting up mailer configuration for development and production
3. Modifying the router to include PhoenixKit routes
## Usage
```bash
mix phoenix_kit.install
```
With custom options:
```bash
mix phoenix_kit.install --repo MyApp.Repo --router-path lib/my_app_web/router.ex
```
## Options
* `--repo` - Specify Ecto repo module (auto-detected if not provided)
* `--router-path` - Specify custom path to router.ex file
* `--prefix` - Specify PostgreSQL schema prefix (defaults to "public")
* `--create-schema` - Create schema if using custom prefix (default: true for non-public prefixes)
## Auto-detection
The installer will automatically:
- Detect Ecto repo from `:ecto_repos` config or common naming patterns (MyApp.Repo)
- Find main router using Phoenix conventions (MyAppWeb.Router)
- Configure Swoosh.Adapters.Local for development in config/dev.exs
- Provide production mailer setup instructions
## Note about warnings
You may see a compiler warning about "unused import PhoenixKitWeb.Integration".
This is normal behavior for Elixir macros and can be safely ignored.
The `phoenix_kit_routes()` macro is properly used and will expand correctly.
"""
@shortdoc "Install PhoenixKit into a Phoenix application"
use Igniter.Mix.Task
alias PhoenixKit.Install.{
ApplicationSupervisor,
AssetRebuild,
BasicConfiguration,
BrowserPipelineIntegration,
CssIntegration,
DemoFiles,
LayoutConfig,
MailerConfig,
MigrationStrategy,
OAuthConfig,
RateLimiterConfig,
RepoDetection,
RouterIntegration
}
alias PhoenixKit.Utils.Routes
@impl Igniter.Mix.Task
def info(_argv, _composing_task) do
%Igniter.Mix.Task.Info{
group: :phoenix_kit,
example: "mix phoenix_kit.install --repo MyApp.Repo --prefix auth",
positional: [],
schema: [
router_path: :string,
repo: :string,
prefix: :string,
create_schema: :boolean,
skip_assets: :boolean
],
aliases: [
r: :router_path,
repo: :repo,
p: :prefix
]
}
end
@impl Igniter.Mix.Task
def igniter(igniter) do
opts = igniter.args.options
igniter
|> BasicConfiguration.add_basic_config()
|> RepoDetection.add_phoenix_kit_configuration(opts[:repo])
|> MailerConfig.add_mailer_configuration()
|> RateLimiterConfig.add_rate_limiter_configuration()
|> OAuthConfig.add_oauth_configuration()
|> ApplicationSupervisor.add_supervisor()
|> LayoutConfig.add_layout_integration_configuration()
|> CssIntegration.add_automatic_css_integration()
|> DemoFiles.copy_test_demo_files()
|> RouterIntegration.add_router_integration(opts[:router_path])
|> BrowserPipelineIntegration.add_integration_to_browser_pipeline()
|> MigrationStrategy.create_phoenix_kit_migration_only(opts)
|> add_completion_notice()
end
# Override run/1 to handle post-igniter interactive migration
def run(argv) do
# Handle --help flag
if "--help" in argv or "-h" in argv do
show_help()
:ok
else
# Store options in process dictionary for later use
opts =
OptionParser.parse(argv,
switches: [
router_path: :string,
repo: :string,
prefix: :string,
create_schema: :boolean,
skip_assets: :boolean
],
aliases: [
r: :router_path,
repo: :repo,
p: :prefix
]
)
# CRITICAL: Check if required configuration exists BEFORE starting app
# This prevents configuration timing issues where config is added via Igniter
# but the app has already started with cached (missing) configuration
config_status = check_required_configuration()
case config_status do
:missing ->
# First pass: Add configuration via Igniter without starting app
show_missing_config_message(argv)
result = super(argv)
show_config_added_message(argv)
result
:ok ->
# Second pass: Configuration exists, safe to start app and complete installation
# Run standard igniter process
result = super(argv)
# After igniter is done, handle interactive migration
MigrationStrategy.handle_interactive_migration_after_config(elem(opts, 1))
# Always rebuild assets unless explicitly skipped
unless Keyword.get(elem(opts, 1), :skip_assets, false) do
AssetRebuild.check_and_rebuild(verbose: true)
end
result
end
end
end
# Display comprehensive help information
defp show_help do
Mix.shell().info("""
mix phoenix_kit.install - Install PhoenixKit into a Phoenix application
USAGE
mix phoenix_kit.install [OPTIONS]
DESCRIPTION
Automatically installs PhoenixKit into a Phoenix application by:
• Auto-detecting and configuring Ecto repository
• Setting up mailer configuration for development and production
• Modifying the router to include PhoenixKit routes
• Creating database migrations for authentication system
• Integrating CSS assets (daisyUI 5 + Tailwind CSS)
OPTIONS
--repo MODULE Specify Ecto repo module (e.g., MyApp.Repo)
Auto-detected if not provided
--router-path PATH Specify custom path to router.ex file
Default: auto-detected (MyAppWeb.Router)
--prefix SCHEMA PostgreSQL schema prefix for PhoenixKit tables
Default: "public" (standard PostgreSQL schema)
Use custom prefix for table isolation
Example: --prefix "auth"
--create-schema Create schema if using custom prefix
Default: true for non-public prefixes
Adds 35+ themes support with theme controller
Default: false
--skip-assets Skip automatic asset rebuild check
Default: false
-h, --help Show this help message
EXAMPLES
# Basic installation with auto-detection (uses default "public" schema)
mix phoenix_kit.install
# Install with specific repository
mix phoenix_kit.install --repo MyApp.Repo
# Install with custom PostgreSQL schema prefix for table isolation
mix phoenix_kit.install --prefix "auth" --create-schema
# Install with custom router path
mix phoenix_kit.install --router-path lib/my_app_web/router.ex
# Install with all options
mix phoenix_kit.install --repo MyApp.Repo --prefix "auth"
AUTO-DETECTION
The installer automatically:
• Detects Ecto repo from :ecto_repos config or naming patterns
• Finds main router using Phoenix conventions
• Configures Swoosh.Adapters.Local for development
• Provides production mailer setup instructions
URL PREFIX CONFIGURATION
PhoenixKit routes are served under a URL prefix (default: /phoenix_kit).
To customize or remove the prefix, configure in config/config.exs:
# Default behavior (prefix: /phoenix_kit)
phoenix_kit_routes()
# Routes: /phoenix_kit/users/register, /phoenix_kit/admin/dashboard
# Custom prefix
config :phoenix_kit, url_prefix: "/auth"
# Routes: /auth/users/register, /auth/admin/dashboard
# No prefix (root-level routes)
config :phoenix_kit, url_prefix: ""
# Routes: /users/register, /admin/dashboard
AFTER INSTALLATION
1. Run database migrations:
mix ecto.migrate
2. Start your Phoenix server:
mix phx.server
3. Visit registration page:
http://localhost:4000/phoenix_kit/users/register
4. Test authentication:
/test-current-user - Check current user
/test-ensure-auth - Test authentication requirement
NOTES
• You may see "unused import PhoenixKitWeb.Integration" warning
This is normal for Elixir macros and can be safely ignored
• The phoenix_kit_routes() macro expands correctly at compile time
DOCUMENTATION
For more information, visit:
https://hexdocs.pm/phoenix_kit
""")
end
# Display message about missing configuration
defp show_missing_config_message(argv) do
Mix.shell().info("""
⚠️ Required configuration is missing from config/config.exs
PhoenixKit requires configuration for:
- Ueberauth (OAuth authentication)
- Hammer (rate limiting)
This configuration will be added now.
After this completes, please run the install command again:
mix phoenix_kit.install #{Enum.join(argv, " ")}
""")
end
# Display message after configuration is added
defp show_config_added_message(argv) do
Mix.shell().info("""
✅ Configuration added successfully!
Next step: Run the install command again to complete the installation:
mix phoenix_kit.install #{Enum.join(argv, " ")}
""")
end
# Check if all required configuration exists
# Returns :ok if all config present, :missing if any config is missing
defp check_required_configuration do
config_file = "config/config.exs"
if File.exists?(config_file) do
content = File.read!(config_file)
lines = String.split(content, "\n")
cond do
# Missing Ueberauth configuration entirely
!String.contains?(content, "config :ueberauth") ->
:missing
# Incorrect Ueberauth configuration (providers: [] instead of providers: %{})
String.contains?(content, "config :ueberauth, Ueberauth") &&
Regex.match?(~r/providers:\s*\[\s*\]/, content) ->
:missing
# Missing Hammer configuration (check for active, non-commented config)
!has_active_hammer_config?(lines) ->
:missing
# All required configuration present
true ->
:ok
end
else
# config.exs doesn't exist - let normal flow handle this error
:ok
end
rescue
# If we can't read config, proceed with normal flow
_ -> :ok
end
# Check if active (non-commented) Hammer configuration exists
defp has_active_hammer_config?(lines) do
has_hammer_config =
Enum.any?(lines, fn line ->
trimmed = String.trim(line)
# Not a comment and contains config :hammer
!String.starts_with?(trimmed, "#") and String.starts_with?(trimmed, "config :hammer")
end)
has_expiry_ms =
Enum.any?(lines, fn line ->
trimmed = String.trim(line)
# Not a comment and contains expiry_ms
!String.starts_with?(trimmed, "#") and String.contains?(line, "expiry_ms")
end)
has_hammer_config and has_expiry_ms
end
# Add completion notice with essential next steps (reduced duplication)
defp add_completion_notice(igniter) do
notice = """
✅ PhoenixKit ready! Next:
• mix ecto.migrate
• mix phx.server
• Visit #{Routes.path("/users/register")}
• Test: /test-current-user, /test-ensure-auth
"""
Igniter.add_notice(igniter, notice)
end
end
# Fallback module for when Igniter is not available
else
defmodule Mix.Tasks.PhoenixKit.Install do
@moduledoc """
PhoenixKit installation task.
This task requires the Igniter library to be available. Please add it to your mix.exs:
{:igniter, "~> 0.6.27"}
Then run: mix deps.get
"""
@shortdoc "Install PhoenixKit (requires Igniter)"
use Mix.Task
def run(_args) do
Mix.shell().error("""
❌ PhoenixKit installation requires the Igniter library.
Please add Igniter to your mix.exs dependencies:
def deps do
[
{:igniter, "~> 0.6.27"}
# ... your other dependencies
]
end
Then run:
mix deps.get
mix phoenix_kit.install
For more information, visit: https://hex.pm/packages/igniter
""")
end
end
end