2019-05-03 06:17:27 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2013-02-06 03:16:51 +08:00
|
|
|
#
|
|
|
|
# A class that handles interaction between a plugin and the Discourse App.
|
|
|
|
#
|
|
|
|
class DiscoursePluginRegistry
|
|
|
|
|
2020-05-13 19:25:34 +08:00
|
|
|
# Shortcut to create new register in the plugin registry
|
|
|
|
# - Register is created in a class variable using the specified name/type
|
|
|
|
# - Defines singleton method to access the register
|
|
|
|
# - Defines instance method as a shortcut to the singleton method
|
|
|
|
# - Automatically deletes the register on ::clear!
|
|
|
|
def self.define_register(register_name, type)
|
|
|
|
@@register_names ||= Set.new
|
|
|
|
@@register_names << register_name
|
|
|
|
|
|
|
|
define_singleton_method(register_name) do
|
|
|
|
instance_variable_get(:"@#{register_name}") ||
|
|
|
|
instance_variable_set(:"@#{register_name}", type.new)
|
|
|
|
end
|
|
|
|
|
|
|
|
define_method(register_name) do
|
|
|
|
self.class.public_send(register_name)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-05-15 21:04:38 +08:00
|
|
|
# Create a new register (see `define_register`) with some additions:
|
|
|
|
# - Register is created in a class variable using the specified name/type
|
|
|
|
# - Defines singleton method to access the register
|
|
|
|
# - Defines instance method as a shortcut to the singleton method
|
|
|
|
# - Automatically deletes the register on ::clear!
|
|
|
|
def self.define_filtered_register(register_name)
|
|
|
|
define_register(register_name, Array)
|
|
|
|
|
|
|
|
singleton_class.alias_method :"_raw_#{register_name}", :"#{register_name}"
|
|
|
|
|
|
|
|
define_singleton_method(register_name) do
|
|
|
|
unfiltered = public_send(:"_raw_#{register_name}")
|
|
|
|
unfiltered
|
|
|
|
.filter { |v| v[:plugin].enabled? }
|
|
|
|
.map { |v| v[:value] }
|
|
|
|
.uniq
|
|
|
|
end
|
|
|
|
|
|
|
|
define_singleton_method("register_#{register_name.to_s.singularize}") do |value, plugin|
|
|
|
|
public_send(:"_raw_#{register_name}") << { plugin: plugin, value: value }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-05-13 19:25:34 +08:00
|
|
|
define_register :javascripts, Set
|
|
|
|
define_register :auth_providers, Set
|
|
|
|
define_register :service_workers, Set
|
|
|
|
define_register :admin_javascripts, Set
|
|
|
|
define_register :stylesheets, Hash
|
|
|
|
define_register :mobile_stylesheets, Hash
|
|
|
|
define_register :desktop_stylesheets, Hash
|
2020-08-06 21:46:17 +08:00
|
|
|
define_register :color_definition_stylesheets, Hash
|
2020-05-13 19:25:34 +08:00
|
|
|
define_register :handlebars, Set
|
|
|
|
define_register :serialized_current_user_fields, Set
|
|
|
|
define_register :seed_data, HashWithIndifferentAccess
|
|
|
|
define_register :locales, HashWithIndifferentAccess
|
|
|
|
define_register :svg_icons, Set
|
|
|
|
define_register :custom_html, Hash
|
|
|
|
define_register :asset_globs, Set
|
|
|
|
define_register :html_builders, Hash
|
|
|
|
define_register :seed_path_builders, Set
|
|
|
|
define_register :vendored_pretty_text, Set
|
|
|
|
define_register :vendored_core_pretty_text, Set
|
2020-06-16 05:28:07 +08:00
|
|
|
define_register :seedfu_filter, Set
|
2020-12-16 17:43:39 +08:00
|
|
|
define_register :demon_processes, Set
|
2013-08-01 13:59:57 +08:00
|
|
|
|
2020-05-15 21:04:38 +08:00
|
|
|
define_filtered_register :staff_user_custom_fields
|
|
|
|
define_filtered_register :public_user_custom_fields
|
|
|
|
|
|
|
|
define_filtered_register :self_editable_user_custom_fields
|
|
|
|
define_filtered_register :staff_editable_user_custom_fields
|
|
|
|
|
|
|
|
define_filtered_register :editable_group_custom_fields
|
|
|
|
|
2020-05-23 12:56:13 +08:00
|
|
|
define_filtered_register :topic_thumbnail_sizes
|
|
|
|
|
2020-08-24 17:24:52 +08:00
|
|
|
define_filtered_register :api_parameter_routes
|
2020-07-17 02:51:24 +08:00
|
|
|
define_filtered_register :api_key_scope_mappings
|
2020-10-09 21:52:48 +08:00
|
|
|
define_filtered_register :user_api_key_scope_mappings
|
2020-07-17 02:51:24 +08:00
|
|
|
|
2020-09-11 00:18:45 +08:00
|
|
|
define_filtered_register :permitted_bulk_action_parameters
|
2021-03-03 00:28:27 +08:00
|
|
|
define_filtered_register :reviewable_params
|
2020-09-11 00:18:45 +08:00
|
|
|
|
2018-07-23 23:51:57 +08:00
|
|
|
def self.register_auth_provider(auth_provider)
|
|
|
|
self.auth_providers << auth_provider
|
|
|
|
end
|
|
|
|
|
2013-02-08 15:56:12 +08:00
|
|
|
def register_js(filename, options = {})
|
2013-02-06 03:16:51 +08:00
|
|
|
# If we have a server side option, add that too.
|
|
|
|
self.class.javascripts << filename
|
|
|
|
end
|
|
|
|
|
2017-11-23 09:02:01 +08:00
|
|
|
def self.register_service_worker(filename, options = {})
|
|
|
|
self.service_workers << filename
|
|
|
|
end
|
|
|
|
|
2018-11-27 05:49:57 +08:00
|
|
|
def self.register_svg_icon(icon)
|
|
|
|
self.svg_icons << icon
|
|
|
|
end
|
|
|
|
|
2019-08-21 00:39:52 +08:00
|
|
|
def register_css(filename, plugin_directory_name)
|
|
|
|
self.class.stylesheets[plugin_directory_name] ||= Set.new
|
|
|
|
self.class.stylesheets[plugin_directory_name] << filename
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|
|
|
|
|
2018-01-25 19:09:18 +08:00
|
|
|
def self.register_locale(locale, options = {})
|
|
|
|
self.locales[locale] = options
|
|
|
|
end
|
|
|
|
|
2013-02-06 03:16:51 +08:00
|
|
|
def register_archetype(name, options = {})
|
|
|
|
Archetype.register(name, options)
|
|
|
|
end
|
|
|
|
|
2015-08-18 03:03:55 +08:00
|
|
|
def self.register_glob(root, extension, options = nil)
|
|
|
|
self.asset_globs << [root, extension, options || {}]
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.each_globbed_asset(each_options = nil)
|
|
|
|
each_options ||= {}
|
|
|
|
|
|
|
|
self.asset_globs.each do |g|
|
|
|
|
root, ext, options = *g
|
|
|
|
|
2015-08-20 03:11:57 +08:00
|
|
|
if options[:admin]
|
|
|
|
next unless each_options[:admin]
|
|
|
|
else
|
|
|
|
next if each_options[:admin]
|
2015-08-19 09:24:09 +08:00
|
|
|
end
|
2015-08-18 03:03:55 +08:00
|
|
|
|
2020-12-04 00:25:42 +08:00
|
|
|
Dir.glob("#{root}/**/*.#{ext}") do |f|
|
|
|
|
yield f
|
2015-08-18 03:03:55 +08:00
|
|
|
end
|
|
|
|
end
|
2014-12-10 04:23:14 +08:00
|
|
|
end
|
|
|
|
|
2020-03-11 21:43:55 +08:00
|
|
|
JS_REGEX = /\.js$|\.js\.erb$|\.js\.es6$/
|
2020-02-12 03:38:12 +08:00
|
|
|
HANDLEBARS_REGEX = /\.(hb[rs]|js\.handlebars)$/
|
2016-11-15 08:42:55 +08:00
|
|
|
|
2019-08-21 00:39:52 +08:00
|
|
|
def self.register_asset(asset, opts = nil, plugin_directory_name = nil)
|
2016-11-15 08:42:55 +08:00
|
|
|
if asset =~ JS_REGEX
|
2014-12-10 03:20:53 +08:00
|
|
|
if opts == :admin
|
|
|
|
self.admin_javascripts << asset
|
2017-04-19 05:49:56 +08:00
|
|
|
elsif opts == :vendored_pretty_text
|
|
|
|
self.vendored_pretty_text << asset
|
2018-04-10 14:37:16 +08:00
|
|
|
elsif opts == :vendored_core_pretty_text
|
|
|
|
self.vendored_core_pretty_text << asset
|
2014-12-10 03:20:53 +08:00
|
|
|
else
|
|
|
|
self.javascripts << asset
|
|
|
|
end
|
|
|
|
elsif asset =~ /\.css$|\.scss$/
|
|
|
|
if opts == :mobile
|
2019-08-21 00:39:52 +08:00
|
|
|
self.mobile_stylesheets[plugin_directory_name] ||= Set.new
|
|
|
|
self.mobile_stylesheets[plugin_directory_name] << asset
|
2014-12-10 03:20:53 +08:00
|
|
|
elsif opts == :desktop
|
2019-08-21 00:39:52 +08:00
|
|
|
self.desktop_stylesheets[plugin_directory_name] ||= Set.new
|
|
|
|
self.desktop_stylesheets[plugin_directory_name] << asset
|
2020-08-06 21:46:17 +08:00
|
|
|
elsif opts == :color_definitions
|
|
|
|
self.color_definition_stylesheets[plugin_directory_name] = asset
|
2014-12-10 03:20:53 +08:00
|
|
|
else
|
2019-08-21 00:39:52 +08:00
|
|
|
self.stylesheets[plugin_directory_name] ||= Set.new
|
|
|
|
self.stylesheets[plugin_directory_name] << asset
|
2014-12-10 03:20:53 +08:00
|
|
|
end
|
2016-11-15 08:42:55 +08:00
|
|
|
elsif asset =~ HANDLEBARS_REGEX
|
2014-12-10 03:20:53 +08:00
|
|
|
self.handlebars << asset
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-08-22 11:09:10 +08:00
|
|
|
def self.stylesheets_exists?(plugin_directory_name, target = nil)
|
|
|
|
case target
|
|
|
|
when :desktop
|
|
|
|
self.desktop_stylesheets[plugin_directory_name].present?
|
|
|
|
when :mobile
|
|
|
|
self.mobile_stylesheets[plugin_directory_name].present?
|
|
|
|
else
|
|
|
|
self.stylesheets[plugin_directory_name].present?
|
|
|
|
end
|
2019-08-21 00:39:52 +08:00
|
|
|
end
|
|
|
|
|
2015-06-05 03:56:17 +08:00
|
|
|
def self.register_seed_data(key, value)
|
|
|
|
self.seed_data[key] = value
|
|
|
|
end
|
|
|
|
|
2017-11-17 03:42:38 +08:00
|
|
|
def self.register_seed_path_builder(&block)
|
|
|
|
seed_path_builders << block
|
|
|
|
end
|
|
|
|
|
2017-04-18 03:47:21 +08:00
|
|
|
def self.register_html_builder(name, &block)
|
2017-11-03 23:32:32 +08:00
|
|
|
html_builders[name] ||= []
|
|
|
|
html_builders[name] << block
|
2017-04-18 03:47:21 +08:00
|
|
|
end
|
|
|
|
|
2017-04-19 01:06:11 +08:00
|
|
|
def self.build_html(name, ctx = nil)
|
2017-11-03 23:32:32 +08:00
|
|
|
builders = html_builders[name] || []
|
2017-11-15 05:31:44 +08:00
|
|
|
builders.map { |b| b.call(ctx) }.join("\n").html_safe
|
2017-04-18 03:47:21 +08:00
|
|
|
end
|
|
|
|
|
2017-11-17 03:42:38 +08:00
|
|
|
def self.seed_paths
|
|
|
|
result = SeedFu.fixture_paths.dup
|
|
|
|
unless Rails.env.test? && ENV['LOAD_PLUGINS'] != "1"
|
|
|
|
seed_path_builders.each { |b| result += b.call }
|
|
|
|
end
|
2017-11-17 04:22:05 +08:00
|
|
|
result.uniq
|
2017-11-17 03:42:38 +08:00
|
|
|
end
|
|
|
|
|
2020-06-16 05:28:07 +08:00
|
|
|
def self.register_seedfu_filter(filter = nil)
|
|
|
|
self.seedfu_filter << filter
|
|
|
|
end
|
|
|
|
|
2018-04-10 14:37:16 +08:00
|
|
|
VENDORED_CORE_PRETTY_TEXT_MAP = {
|
2019-02-13 02:57:52 +08:00
|
|
|
"moment.js" => "vendor/assets/javascripts/moment.js",
|
|
|
|
"moment-timezone.js" => "vendor/assets/javascripts/moment-timezone-with-data.js"
|
2018-04-10 14:37:16 +08:00
|
|
|
}
|
|
|
|
def self.core_asset_for_name(name)
|
|
|
|
asset = VENDORED_CORE_PRETTY_TEXT_MAP[name]
|
|
|
|
raise KeyError, "Asset #{name} not found in #{VENDORED_CORE_PRETTY_TEXT_MAP}" unless asset
|
|
|
|
asset
|
|
|
|
end
|
|
|
|
|
2014-12-10 03:20:53 +08:00
|
|
|
def self.reset!
|
2020-05-13 19:25:34 +08:00
|
|
|
@@register_names.each do |name|
|
|
|
|
instance_variable_set(:"@#{name}", nil)
|
|
|
|
end
|
2014-12-10 03:20:53 +08:00
|
|
|
end
|
|
|
|
|
2021-07-02 23:40:50 +08:00
|
|
|
def self.reset_register!(register_name)
|
|
|
|
found_register = @@register_names.detect { |name| name == register_name }
|
|
|
|
|
|
|
|
if found_register
|
|
|
|
instance_variable_set(:"@#{found_register}", nil)
|
|
|
|
end
|
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
end
|