discourse/bin/ember-cli
Sam bb8ed7d6f9
DEV: fix linter and linting config (#36815)
This amends lefthook to use the more reliable doublestar globber:
https://github.com/evilmartians/lefthook/blob/master/docs/mdbook/configuration/glob_matcher.md
it also cleans up the config so we can properly run and filter.

Notably ember linter explodes if you pass it files your are not meant to
lint.

The current fix has bin/lint read the config from lefthook and filter
out the files that need no linting. `--file` overrides the glob so we
can not pass in files unfiltered.

This also simplifies some of the linters internals for easier
maintenance
2025-12-22 07:23:19 +11:00

156 lines
4 KiB
Ruby
Executable file

#!/usr/bin/env ruby
# frozen_string_literal: true
require "pathname"
require "open3"
RAILS_ROOT = File.expand_path("../../", Pathname.new(__FILE__).realpath)
PORT = ENV["UNICORN_PORT"] ||= "3000"
HOSTNAME = ENV["DISCOURSE_HOSTNAME"] ||= "127.0.0.1"
CUSTOM_ARGS = %w[--try --test --build --unicorn -u --forward-host]
PROXY =
if ARGV.include?("--try")
"https://try.discourse.org"
else
"http://#{HOSTNAME}:#{PORT}"
end
def process_running?(pid)
!!Process.kill(0, pid)
rescue Errno::ESRCH
false
end
command =
if ARGV.include?("--test")
"test"
elsif ARGV.include?("--build")
"build"
else
"server"
end
class String
def cyan
"\e[36m#{self}\e[0m"
end
def red
"\033[31m#{self}\e[0m"
end
end
if ARGV.include?("-h") || ARGV.include?("--help")
puts "ember-cli OPTIONS"
puts "#{"--try".cyan} To proxy try.discourse.org"
puts "#{"--test".cyan} To run the test suite"
puts "#{"--unicorn, -u".cyan} To run a unicorn server as well"
puts "The rest of the arguments are passed to ember server per:", ""
exec "pnpm ember #{command} --help"
end
args = ["--dir=frontend/discourse", "ember", command] + (ARGV - CUSTOM_ARGS)
if !args.include?("test") && !args.include?("build") && !args.include?("--proxy")
args << "--proxy"
args << PROXY
end
node_modules_outdated =
begin
File.read("node_modules/.pnpm/lock.yaml") != File.read("pnpm-lock.yaml")
rescue ERRNO::ENOENT
true
end
if node_modules_outdated
puts "[bin/ember-cli] Detected outdated or missing node_modules. Running pnpm install..."
if !system "pnpm", "--dir=#{RAILS_ROOT}", "install"
if !system("command -v pnpm >/dev/null;")
abort "pnpm is not installed. run `npm install -g pnpm`"
end
exit 1
end
end
pnpm_env = {
"TERM" => "dumb", # simple output from ember-cli, so we can parse/forward it more easily
}
pnpm_env["FORWARD_HOST"] = "true" if ARGV.include?("--forward-host")
if ARGV.include?("-u") || ARGV.include?("--unicorn")
unicorn_env = { "DISCOURSE_PORT" => ENV["DISCOURSE_PORT"] || "4200" }
if command == "server" && ENV["CODESPACE_NAME"]
unicorn_env.merge!(
{
"DISCOURSE_PORT" => "443",
"DISCOURSE_FORCE_HTTPS" => "1",
"DISCOURSE_FORCE_HOSTNAME" =>
"#{ENV["CODESPACE_NAME"]}-4200.#{ENV["GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN"]}",
},
)
end
unicorn_pid = spawn(unicorn_env, __dir__ + "/unicorn")
ember_cli_pid = nil
tsc_pid = nil
Thread.new do
Open3.popen2e(pnpm_env, "pnpm", *args.to_a.flatten) do |i, oe, t|
ember_cli_pid = t.pid
puts "Ember CLI running on PID: #{ember_cli_pid}"
oe.each do |line|
if line.include?("\e[32m200\e") || line.include?("\e[36m304\e[0m") ||
line.include?("POST /message-bus")
# skip 200s and 304s and message bus
else
puts "[ember-cli] #{line}"
end
end
end
if process_running?(unicorn_pid)
puts "[bin/ember-cli] ember-cli process stopped. Terminating unicorn."
Process.kill("TERM", unicorn_pid)
end
end
Thread.new do
Open3.popen2e(
pnpm_env,
"pnpm",
"ember-tsc",
"-b",
"--watch",
"--preserveWatchOutput",
) do |i, oe, t|
tsc_pid = t.pid
puts "Ember TSC running on PID: #{tsc_pid}"
oe.each { |line| puts "[ember-tsc] #{line}" }
end
if process_running?(unicorn_pid)
puts "[bin/ember-cli] ember-tsc process stopped. Terminating unicorn."
Process.kill("TERM", unicorn_pid)
end
end
trap("SIGINT") do
# we got to swallow sigint to give time for
# children to handle it
end
Process.wait(unicorn_pid)
if ember_cli_pid && process_running?(ember_cli_pid)
puts "[bin/ember-cli] unicorn process stopped. Terminating ember-cli."
Process.kill("TERM", ember_cli_pid)
end
if tsc_pid && process_running?(tsc_pid)
puts "[bin/ember-cli] unicorn process stopped. Terminating ember-tsc."
Process.kill("TERM", tsc_pid)
end
else
exec(pnpm_env, "pnpm", *args.to_a.flatten)
end