Packages
igniter
0.8.0
0.8.2
0.8.1
0.8.0
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.30
0.6.29
0.6.28
0.6.27
0.6.26
0.6.25
0.6.24
0.6.23
0.6.22
0.6.21
0.6.20
0.6.19
0.6.18
0.6.17
0.6.16
0.6.15
0.6.14
0.6.13
0.6.12
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.52
0.5.51
0.5.50
0.5.49
0.5.48
0.5.47
0.5.46
0.5.45
0.5.44
0.5.43
0.5.42
0.5.41
0.5.40
0.5.39
0.5.38
0.5.37
0.5.36
0.5.35
0.5.34
0.5.33
0.5.32
0.5.31
0.5.30
0.5.29
0.5.28
0.5.27
0.5.26
0.5.25
0.5.24
0.5.23
0.5.22
0.5.21
0.5.20
0.5.19
0.5.18
0.5.17
0.5.16
0.5.15
0.5.14
0.5.13
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.78
0.3.77
0.3.76
0.3.75
0.3.74
0.3.73
0.3.72
0.3.71
0.3.70
0.3.69
0.3.68
0.3.67
0.3.66
0.3.65
0.3.64
0.3.63
0.3.62
0.3.61
0.3.60
0.3.59
0.3.58
0.3.57
0.3.56
0.3.55
0.3.54
0.3.53
0.3.52
0.3.51
0.3.50
0.3.49
0.3.48
0.3.47
0.3.46
0.3.45
0.3.44
0.3.43
0.3.42
0.3.41
0.3.40
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A code generation and project patching framework
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/igniter.phx.install.ex
# SPDX-FileCopyrightText: 2024 igniter contributors <https://github.com/ash-project/igniter/graphs/contributors>
#
# SPDX-License-Identifier: MIT
defmodule Mix.Tasks.Igniter.Phx.Install do
@moduledoc false
use Igniter.Mix.Task
@example "mix igniter.phx.install . --module MyApp --app my_app"
# No docs yet, its only for testing
# @shortdoc "Creates a new Phoenix project in the current application."
# @moduledoc """
# #{@shortdoc}
#
# ## Example
#
# ```bash
# #{@example}
# ```
#
# ## Options
#
# * `--app` - the name of the OTP application
#
# * `--module` - the name of the base module in
# the generated skeleton
#
# * `--database` - specify the database adapter for Ecto. One of:
#
# * `postgres` - via https://github.com/elixir-ecto/postgrex
# * `mysql` - via https://github.com/elixir-ecto/myxql
# * `mssql` - via https://github.com/livehelpnow/tds
# * `sqlite3` - via https://github.com/elixir-sqlite/ecto_sqlite3
#
# Please check the driver docs for more information
# and requirements. Defaults to "postgres".
#
# * `--adapter` - specify the http adapter. One of:
# * `cowboy` - via https://github.com/elixir-plug/plug_cowboy
# * `bandit` - via https://github.com/mtrudel/bandit
#
# Please check the adapter docs for more information
# and requirements. Defaults to "bandit".
#
# * `--no-assets` - equivalent to `--no-esbuild` and `--no-tailwind`
#
# * `--no-dashboard` - do not include Phoenix.LiveDashboard
#
# * `--no-ecto` - do not generate Ecto files
#
# * `--no-esbuild` - do not include esbuild dependencies and assets.
# We do not recommend setting this option, unless for API only
# applications, as doing so requires you to manually add and
# track JavaScript dependencies
#
# * `--no-gettext` - do not generate gettext files
#
# * `--no-html` - do not generate HTML views
#
# * `--no-live` - comment out LiveView socket setup in your Endpoint
# and assets/js/app.js. Automatically disabled if --no-html is given
#
# * `--no-mailer` - do not generate Swoosh mailer files
#
# * `--no-tailwind` - do not include tailwind dependencies and assets.
# The generated markup will still include Tailwind CSS classes, those
# are left-in as reference for the subsequent styling of your layout
# and components
#
# * `--binary-id` - use `binary_id` as primary key type in Ecto schemas
#
# * `--verbose` - use verbose output
#
# When passing the `--no-ecto` flag, Phoenix generators such as
# `phx.gen.html`, `phx.gen.json`, `phx.gen.live`, and `phx.gen.context`
# may no longer work as expected as they generate context files that rely
# on Ecto for the database access. In those cases, you can pass the
# `--no-context` flag to generate most of the HTML and JSON files
# but skip the context, allowing you to fill in the blanks as desired.
#
# Similarly, if `--no-html` is given, the files generated by
# `phx.gen.html` will no longer work, as important HTML components
# will be missing.
#
# """
def info(_argv, _source) do
%Igniter.Mix.Task.Info{
group: :igniter,
example: @example,
positional: [:base_path],
schema: [
app: :string,
module: :string,
database: :string,
adapter: :string,
assets: :boolean,
dashboard: :boolean,
ecto: :boolean,
esbuild: :boolean,
gettext: :boolean,
html: :boolean,
live: :boolean,
mailer: :boolean,
tailwind: :boolean,
binary_id: :boolean,
verbose: :boolean
]
}
end
def igniter(igniter) do
elixir_version_check!()
if !Code.ensure_loaded?(Phx.New.Generator) do
Mix.raise("""
Phoenix installer is not available. Please install it before proceeding:
mix archive.install hex phx_new
""")
end
if igniter.args.options[:umbrella] do
Mix.raise("Umbrella projects are not supported yet.")
end
%{base_path: base_path} = igniter.args.positional
generate(igniter, base_path, {Phx.New.Single, Igniter.Phoenix.Single}, igniter.args.options)
end
defp generate(igniter, base_path, {phx_generator, igniter_generator}, opts) do
project =
apply(Phx.New.Project, :new, [base_path, opts])
|> phx_generator.prepare_project()
project =
apply(Phx.New.Generator, :put_binding, [project])
|> validate_project()
igniter
|> Igniter.compose_task("igniter.add_extension", ["phoenix"])
|> igniter_generator.generate(project)
end
defp validate_project(%{opts: opts} = project) do
check_app_name!(project.app, !!opts[:app])
check_module_name_validity!(project.root_mod)
project
end
defp check_app_name!(name, from_app_flag) do
unless name =~ Regex.recompile!(~r/^[a-z][a-z0-9_]*$/) do
extra =
if from_app_flag do
""
else
". The application name is inferred from the path, if you'd like to " <>
"explicitly name the application then use the `--app APP` option."
end
Mix.raise(
"Application name must start with a letter and have only lowercase " <>
"letters, numbers and underscore, got: #{inspect(name)}" <> extra
)
end
end
defp check_module_name_validity!(name) do
unless inspect(name) =~ Regex.recompile!(~r/^[A-Z]\w*(\.[A-Z]\w*)*$/) do
Mix.raise(
"Module name must be a valid Elixir alias (for example: Foo.Bar), got: #{inspect(name)}"
)
end
end
defp elixir_version_check! do
unless Version.match?(System.version(), "~> 1.15") do
Mix.raise(
"mix igniter.phx.install requires at least Elixir v1.15\n " <>
"You have #{System.version()}. Please update accordingly."
)
end
end
end