Packages
phoenix_kit
1.7.120
1.7.210
1.7.209
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
Current section
Files
lib/mix/tasks/phoenix_kit.gen.migration.ex
defmodule Mix.Tasks.PhoenixKit.Gen.Migration do
use Mix.Task
@moduledoc """
Generate a PhoenixKit versioned migration for the parent application.
Scans existing migrations in `priv/repo/migrations/` to determine the current
PhoenixKit version, then generates a migration that upgrades to the latest version.
## Usage
mix phoenix_kit.gen.migration
## Options
* `--prefix` - Database schema prefix (default: "public")
## Examples
# Generate upgrade migration with default prefix
mix phoenix_kit.gen.migration
# Generate with custom schema prefix
mix phoenix_kit.gen.migration --prefix my_schema
"""
alias PhoenixKit.Migrations.Postgres, as: PkMigrations
@shortdoc "Generate PhoenixKit versioned migration"
@impl Mix.Task
def run(args) do
opts = parse_args(args)
prefix = opts[:prefix] || "public"
from_version = detect_current_version()
to_version = PkMigrations.current_version()
if from_version >= to_version do
IO.puts("✅ Already at latest PhoenixKit migration version (v#{to_version}). Nothing to do.")
else
generate_migration(from_version, to_version, prefix)
end
end
defp parse_args(args) do
{opts, _, _} = OptionParser.parse(args, switches: [prefix: :string])
opts
end
# Scan existing migration files to find the highest PhoenixKit version applied.
# Looks for files matching `*_phoenix_kit_update_v*_to_v*.exs` or `*_create_phoenix_kit_tables.exs`.
defp detect_current_version do
migrations_path = "priv/repo/migrations"
if File.dir?(migrations_path) do
migrations_path
|> File.ls!()
|> Enum.filter(&String.ends_with?(&1, ".exs"))
|> Enum.flat_map(&extract_phoenix_kit_version/1)
|> Enum.max(fn -> 0 end)
else
0
end
end
# Extract the "to" version from migration filenames like:
# - `20260310_phoenix_kit_update_v78_to_v80.exs` → 80
# - `20260316_create_phoenix_kit_tables.exs` → 0 (initial install)
defp extract_phoenix_kit_version(filename) do
cond do
# Pattern: phoenix_kit_update_vXX_to_vYY.exs
match = Regex.run(~r/phoenix_kit_update_v\d+_to_v(\d+)/, filename) ->
[_, version_str] = match
[String.to_integer(version_str)]
# Pattern: create_phoenix_kit_tables.exs (initial install = version 1)
String.contains?(filename, "create_phoenix_kit_tables") ->
[1]
true ->
[]
end
end
defp generate_migration(from_version, to_version, prefix) do
timestamp = generate_timestamp()
slug = "phoenix_kit_update_v#{from_version}_to_v#{to_version}"
filename = "#{timestamp}_#{slug}.exs"
path = Path.join("priv/repo/migrations", filename)
File.mkdir_p!("priv/repo/migrations")
app_module = app_module_name()
content = migration_content(app_module, slug, from_version, to_version, prefix)
File.write!(path, content)
IO.puts("✅ Generated migration: #{filename}")
IO.puts(" Upgrades PhoenixKit: v#{from_version} → v#{to_version}")
IO.puts("Run: mix ecto.migrate")
end
defp app_module_name do
app = Mix.Project.config()[:app]
app
|> to_string()
|> Macro.camelize()
end
defp migration_content(app_module, slug, from_version, to_version, prefix) do
module_name = Macro.camelize(slug)
create_schema = prefix != "public"
"""
defmodule #{app_module}.Repo.Migrations.#{module_name} do
@moduledoc false
use Ecto.Migration
@disable_ddl_transaction true
def up do
# PhoenixKit Update Migration: V#{from_version} -> V#{to_version}
PhoenixKit.Migrations.up(
prefix: "#{prefix}",
version: #{to_version},
create_schema: #{create_schema}
)
end
def down do
# Rollback PhoenixKit to V#{from_version}
PhoenixKit.Migrations.down(
prefix: "#{prefix}",
version: #{from_version}
)
end
end
"""
end
defp generate_timestamp do
{{year, month, day}, {hour, minute, second}} = :calendar.universal_time()
:io_lib.format(
"~4..0B~2..0B~2..0B~2..0B~2..0B~2..0B",
[year, month, day, hour, minute, second]
)
|> to_string()
end
end