discourse/script/build_jsconfig.rb
David Taylor e56a4bf03e DEV: Prepare for rename of app/assets/javascripts/ -> frontend/
This commit contains all the code changes. A followup will perform the actual move
2025-10-22 16:24:11 +01:00

71 lines
2.3 KiB
Ruby
Executable file

#!/usr/bin/env ruby
# frozen_string_literal: true
require "pathname"
require "json"
Dir.chdir("#{__dir__}/..") # rubocop:disable Discourse/NoChdir because this is not part of the app
CORE_NAMESPACES = {
"discourse/admin/*" => ["frontend/discourse/admin"],
"discourse/*" => ["frontend/discourse/app"],
"discourse/tests/*" => ["frontend/discourse/tests"],
"admin/*" => ["frontend/discourse/admin"], # TODO: remove once all core code is migrated to new import path
"pretty-text/*" => ["frontend/pretty-text/addon"],
"select-kit/*" => ["frontend/select-kit/addon"],
"float-kit/*" => ["frontend/float-kit/addon"],
"truth-helpers/*" => ["frontend/truth-helpers/addon"],
"dialog-holder/*" => ["frontend/dialog-holder/addon"],
}
def relative(from, to)
relative_path = Pathname.new(to).relative_path_from(from).to_s
relative_path = "./#{relative_path}" if !relative_path.start_with?(".")
relative_path
end
def write_config(package_dir, extras: {})
package_dir = Pathname.new(package_dir)
namespaces = { **CORE_NAMESPACES, **extras }
config = {
"compilerOptions" => {
"target" => "es2021",
"module" => "esnext",
"moduleResolution" => "bundler",
"experimentalDecorators" => true,
"allowJs" => true,
"paths" => {
**namespaces
.map { |ns, paths| [ns, paths.map { |p| "#{relative(package_dir, p)}/*" }] }
.to_h,
},
},
"include" => namespaces.flat_map { |ns, paths| paths.map { |p| relative(package_dir, p) } },
"exclude" => [
"frontend/discourse/tests/unit/utils/decorators-test.js", # Native class decorators - unsupported by ts/glint
],
}
output = <<~JSON
// This file was generated by script/build_jsconfig.rb
#{JSON.pretty_generate(config)}
JSON
File.write("#{package_dir}/jsconfig.json", output)
end
plugin_configs =
`git ls-files plugins/*/plugin.rb`.lines
.map { File.dirname(_1) }
.map do |path|
["discourse/#{path}/*", ["#{path}/assets/javascripts", "#{path}/test/javascripts"]]
end
.to_h
theme_configs =
`git ls-files themes/*/about.json`.lines
.map { File.dirname(_1) }
.map { |path| ["discourse/#{path}/*", ["#{path}/javascripts", "#{path}/test"]] }
.to_h
write_config ".", extras: plugin_configs.merge(theme_configs)