diff --git a/app/assets/javascripts/discourse.js.es6 b/app/assets/javascripts/discourse.js.es6 index cee3fcbd57f..25c05f1c305 100644 --- a/app/assets/javascripts/discourse.js.es6 +++ b/app/assets/javascripts/discourse.js.es6 @@ -1,7 +1,9 @@ import { buildResolver } from 'discourse-common/resolver'; import { default as computed, observes } from 'ember-addons/ember-computed-decorators'; +import PreloadStore from 'preload-store'; const _pluginCallbacks = []; +const _pluginDefinitions = {}; const Discourse = Ember.Application.extend({ rootElement: '#main', @@ -101,6 +103,16 @@ const Discourse = Ember.Application.extend({ $('noscript').remove(); + // Load plugin definions. + const disabledPlugins = PreloadStore.get('site').disabled_plugins; + Object.keys(_pluginDefinitions).forEach((key) => { + if(!(disabledPlugins.includes(key))){ // Not disabled, so load it + _pluginDefinitions[key].forEach((func) => { + func(); + }); + } + }); + Object.keys(requirejs._eak_seen).forEach(function(key) { if (/\/pre\-initializers\//.test(key)) { const module = requirejs(key, null, null, true); @@ -154,6 +166,13 @@ const Discourse = Ember.Application.extend({ _pluginCallbacks.push({ version, code }); }, + _registerPluginScriptDefinition(pluginName, definition) { + if(!(pluginName in _pluginDefinitions)){ + _pluginDefinitions[pluginName] = []; + } + _pluginDefinitions[pluginName].push(definition); + }, + assetVersion: Ember.computed({ get() { return this.get("currentAssetVersion"); diff --git a/config/initializers/014-wrap_plugin_js.rb b/config/initializers/014-wrap_plugin_js.rb new file mode 100644 index 00000000000..bbf13ab3568 --- /dev/null +++ b/config/initializers/014-wrap_plugin_js.rb @@ -0,0 +1,5 @@ +require 'discourse_wrap_plugin_js' + +Rails.application.config.assets.configure do |env| + env.register_preprocessor('application/javascript', DiscourseWrapPluginJS) +end diff --git a/lib/discourse_wrap_plugin_js.rb b/lib/discourse_wrap_plugin_js.rb new file mode 100644 index 00000000000..67cc850bd03 --- /dev/null +++ b/lib/discourse_wrap_plugin_js.rb @@ -0,0 +1,31 @@ +class DiscourseWrapPluginJS + def initialize(options = {}, &block) + end + + def self.instance + @instance ||= new + end + + def self.call(input) + instance.call(input) + end + + # Add stuff around javascript + def call(input) + path = input[:environment].context_class.new(input).pathname.to_s + data = input[:data] + + # Only apply to plugin paths + return data unless (path =~ /\/plugins\//) + + # Find the folder name of the plugin + folder_name = path[/\/plugins\/(\S+?)\//, 1] + + # Lookup plugin name + plugin = Discourse.plugins.find { |p| p.path =~ /\/plugins\/#{folder_name}\// } + plugin_name = plugin.name + + "Discourse._registerPluginScriptDefinition('#{plugin_name}', function(){#{data}}); \n" + end + +end