From 7eb32be4def71900a4356e3ac5595d0a0cd261c6 Mon Sep 17 00:00:00 2001
From: Robin Ward <robin.ward@gmail.com>
Date: Mon, 17 Aug 2015 15:03:55 -0400
Subject: [PATCH] Add support for plugins to declare ES6 in the admin bundle

---
 app/assets/javascripts/admin.js.erb       |  8 ++++++++
 app/assets/javascripts/application.js.erb | 14 +++++---------
 lib/discourse_plugin_registry.rb          | 18 ++++++++++++++++--
 lib/plugin/instance.rb                    |  5 +++++
 4 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/app/assets/javascripts/admin.js.erb b/app/assets/javascripts/admin.js.erb
index ce47046a21c..41f0315debb 100644
--- a/app/assets/javascripts/admin.js.erb
+++ b/app/assets/javascripts/admin.js.erb
@@ -2,4 +2,12 @@
 require_asset("main_include_admin.js")
 
 DiscoursePluginRegistry.admin_javascripts.each { |js| require_asset(js) }
+
+DiscoursePluginRegistry.each_globbed_asset(admin: true) do |f, ext|
+  if File.directory?(f)
+    depend_on(f)
+  elsif f.to_s.end_with?(".#{ext}")
+    require_asset(f)
+  end
+end
 %>
diff --git a/app/assets/javascripts/application.js.erb b/app/assets/javascripts/application.js.erb
index 64a1f7dd398..4b040e3bd65 100644
--- a/app/assets/javascripts/application.js.erb
+++ b/app/assets/javascripts/application.js.erb
@@ -6,15 +6,11 @@ require_asset ("./main_include.js")
 DiscoursePluginRegistry.javascripts.each { |js| require_asset(js) }
 DiscoursePluginRegistry.handlebars.each { |hb| require_asset(hb) }
 
-# Load any glob dependencies
-DiscoursePluginRegistry.asset_globs.each do |g|
-  root, extension = *g
-  Dir.glob("#{root}/**/*") do |f|
-    if File.directory?(f)
-      depend_on(f)
-    elsif f.to_s.end_with?(".#{extension}")
-      require_asset(f)
-    end
+DiscoursePluginRegistry.each_globbed_asset do |f, ext|
+  if File.directory?(f)
+    depend_on(f)
+  elsif f.to_s.end_with?(".#{ext}")
+    require_asset(f)
   end
 end
 
diff --git a/lib/discourse_plugin_registry.rb b/lib/discourse_plugin_registry.rb
index 8875807f5ad..f3003c4e333 100644
--- a/lib/discourse_plugin_registry.rb
+++ b/lib/discourse_plugin_registry.rb
@@ -77,8 +77,22 @@ class DiscoursePluginRegistry
     Archetype.register(name, options)
   end
 
-  def self.register_glob(root, extension)
-    self.asset_globs << [root, extension]
+  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
+
+      next if options[:admin] && !each_options[:admin]
+
+      Dir.glob("#{root}/**/*") do |f|
+        yield f, ext
+      end
+    end
   end
 
   def self.register_asset(asset, opts=nil)
diff --git a/lib/plugin/instance.rb b/lib/plugin/instance.rb
index b0f7c37db10..caa406ec243 100644
--- a/lib/plugin/instance.rb
+++ b/lib/plugin/instance.rb
@@ -223,6 +223,10 @@ class Plugin::Instance
       root_path = "#{File.dirname(@path)}/assets/javascripts"
       DiscoursePluginRegistry.register_glob(root_path, 'js.es6')
       DiscoursePluginRegistry.register_glob(root_path, 'hbs')
+
+      admin_path = "#{File.dirname(@path)}/admin/assets/javascripts"
+      DiscoursePluginRegistry.register_glob(admin_path, 'js.es6', admin: true)
+      DiscoursePluginRegistry.register_glob(admin_path, 'hbs', admin: true)
     end
 
     self.instance_eval File.read(path), path
@@ -241,6 +245,7 @@ class Plugin::Instance
     # Automatically include assets
     Rails.configuration.assets.paths << auto_generated_path
     Rails.configuration.assets.paths << File.dirname(path) + "/assets"
+    Rails.configuration.assets.paths << File.dirname(path) + "/admin/assets"
 
     # Automatically include rake tasks
     Rake.add_rakelib(File.dirname(path) + "/lib/tasks")