Files
bDS2/lib/mix/tasks/monaco.update.ex

94 lines
2.6 KiB
Elixir

defmodule Mix.Tasks.Monaco.Update do
@shortdoc "Update monaco-editor to a given version and rebuild its bundle"
@moduledoc """
Update the monaco-editor npm package and rebuild the Monaco ESM bundle.
mix monaco.update 0.55.1
This task:
1. Runs `npm install monaco-editor@<version> --save-dev`
2. Removes the old Monaco bundle assets
3. Rebuilds the Monaco main and worker bundles via esbuild (both dev and minified)
Use `mix monaco.version` to check the result.
See `npm view monaco-editor` or https://www.npmjs.com/package/monaco-editor
for available versions.
"""
use Mix.Task
@impl Mix.Task
def run(args) do
case args do
[] ->
Mix.shell().error("Missing version argument.")
Mix.shell().info("Usage: mix monaco.update <version>")
Mix.shell().info("Example: mix monaco.update 0.55.1")
Mix.raise("missing Monaco version argument")
[version] ->
do_update(version)
_ ->
Mix.shell().error("Too many arguments. Usage: mix monaco.update <version>")
Mix.raise("too many arguments for mix monaco.update")
end
end
defp do_update(version) do
current = current_version()
Mix.shell().info("Updating monaco-editor: #{current}#{version}")
# 1. npm install
{_, 0} = System.cmd("npm", ["install", "monaco-editor@#{version}", "--save-dev"], into: IO.stream(:stdio, :line))
{_, 0} = System.cmd("npm", ["install"], into: IO.stream(:stdio, :line))
# 2. Clean old bundle
monaco_js = Path.join(File.cwd!(), "priv/static/assets/monaco.js")
monaco_css = Path.join(File.cwd!(), "priv/static/assets/monaco.css")
monaco_workers = Path.join(File.cwd!(), "priv/static/assets/monaco")
for path <- [monaco_js, monaco_css, monaco_workers] do
if File.exists?(path) do
File.rm_rf!(path)
end
end
Mix.shell().info("Removed old Monaco bundle assets")
# 3. Rebuild via esbuild (dev + minified)
run_esbuild(["monaco"])
run_esbuild(["monaco_workers"])
run_esbuild(["monaco", "--minify"])
run_esbuild(["monaco_workers", "--minify"])
# 4. Verify
new = current_version()
Mix.shell().info("monaco-editor is now at #{new}")
end
defp run_esbuild(args) do
Mix.Task.run("esbuild", args)
end
defp current_version do
lock = Path.join(File.cwd!(), "package-lock.json")
case File.read(lock) do
{:ok, content} ->
data = Jason.decode!(content)
case Map.get(Map.get(data, "packages", %{}), "node_modules/monaco-editor") do
%{"version" => v} -> v
_ -> "unknown"
end
_ ->
"unknown"
end
end
end