From 4d62c49e2012e3158afac70bc4b758ead36797aa Mon Sep 17 00:00:00 2001
From: Godfrey Chan <godfreykfc@gmail.com>
Date: Thu, 13 Jul 2023 10:57:45 -0700
Subject: [PATCH] DEV: move raw handlebars to /raw-templates/ (#22574)

The primary motivation is to simplify `eagerLoadRawTemplateModules` which curently introspects the module dependencies (the `imports` at runtime). This is no longer supported in Embroider as the AMD shims do not have any dependencies (since it's managed internally with webpack).
---
 .../discourse-common/addon/lib/raw-templates.js      |  8 +++-----
 .../discourse-hbr/raw-handlebars-compiler.js         |  4 ++--
 app/assets/javascripts/discourse-plugins/index.js    | 11 +++++++++--
 .../badge-selector-autocomplete.hbr                  |  0
 .../category-selector-autocomplete.hbr               |  0
 .../category-tag-autocomplete.hbr                    |  0
 .../emoji-selector-autocomplete.hbr                  |  0
 .../app/{templates => raw-templates}/flat-button.hbr |  0
 .../group-selector-autocomplete.hbr                  |  0
 .../hashtag-autocomplete.hbr                         |  0
 .../list/action-list.hbr                             |  0
 .../list/activity-column.hbr                         |  0
 .../list/category-column.hbr                         |  0
 .../list/participant-groups.hbr                      |  0
 .../list/post-count-or-badges.hbr                    |  0
 .../list/posters-column.hbr                          |  0
 .../list/posts-count-column.hbr                      |  0
 .../list/topic-excerpt.hbr                           |  0
 .../list/topic-list-item.hbr                         |  0
 .../list/unread-indicator.hbr                        |  0
 .../list/visited-line.hbr                            |  0
 .../mobile/list/topic-list-item.hbr                  |  0
 .../post/poster-avatar.hbr                           |  0
 .../topic-list-header-column.hbr                     |  0
 .../topic-list-header.hbr                            |  0
 .../topic-post-badges.hbr                            |  0
 .../{templates => raw-templates}/topic-status.hbr    |  0
 .../user-selector-autocomplete.hbr                   |  0
 lib/theme_javascript_compiler.rb                     | 12 +++++++++---
 29 files changed, 23 insertions(+), 12 deletions(-)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/badge-selector-autocomplete.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/category-selector-autocomplete.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/category-tag-autocomplete.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/emoji-selector-autocomplete.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/flat-button.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/group-selector-autocomplete.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/hashtag-autocomplete.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/action-list.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/activity-column.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/category-column.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/participant-groups.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/post-count-or-badges.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/posters-column.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/posts-count-column.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/topic-excerpt.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/topic-list-item.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/unread-indicator.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/list/visited-line.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/mobile/list/topic-list-item.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/post/poster-avatar.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/topic-list-header-column.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/topic-list-header.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/topic-post-badges.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/topic-status.hbr (100%)
 rename app/assets/javascripts/discourse/app/{templates => raw-templates}/user-selector-autocomplete.hbr (100%)

diff --git a/app/assets/javascripts/discourse-common/addon/lib/raw-templates.js b/app/assets/javascripts/discourse-common/addon/lib/raw-templates.js
index b979d7c8fff..5a8bd75e100 100644
--- a/app/assets/javascripts/discourse-common/addon/lib/raw-templates.js
+++ b/app/assets/javascripts/discourse-common/addon/lib/raw-templates.js
@@ -1,4 +1,5 @@
 import { getResolverOption } from "discourse-common/resolver";
+import require from "require";
 
 export const __DISCOURSE_RAW_TEMPLATES = {};
 
@@ -45,11 +46,8 @@ export function buildRawConnectorCache(findOutlets) {
 }
 
 export function eagerLoadRawTemplateModules() {
-  for (const [key, value] of Object.entries(requirejs.entries)) {
-    if (
-      key.includes("/templates/") &&
-      value.deps.includes("discourse-common/lib/raw-templates")
-    ) {
+  for (const key of Object.keys(requirejs.entries)) {
+    if (key.includes("/raw-templates/")) {
       require(key);
     }
   }
diff --git a/app/assets/javascripts/discourse-hbr/raw-handlebars-compiler.js b/app/assets/javascripts/discourse-hbr/raw-handlebars-compiler.js
index 06dce159431..ec2091aeac8 100644
--- a/app/assets/javascripts/discourse-hbr/raw-handlebars-compiler.js
+++ b/app/assets/javascripts/discourse-hbr/raw-handlebars-compiler.js
@@ -141,9 +141,9 @@ TemplateCompiler.prototype.processString = function (string, relativePath) {
   if (pluginName) {
     filename = relativePath
       .replace(`discourse/plugins/${pluginName}/`, "")
-      .replace(/^(discourse\/)?templates\//, "javascripts/");
+      .replace(/^(discourse\/)?raw-templates\//, "javascripts/");
   } else {
-    filename = relativePath.replace(/^templates\//, "");
+    filename = relativePath.replace(/^raw-templates\//, "");
   }
 
   filename = filename.replace(/\.hbr$/, "");
diff --git a/app/assets/javascripts/discourse-plugins/index.js b/app/assets/javascripts/discourse-plugins/index.js
index dbf4f56c6be..a30535a4b49 100644
--- a/app/assets/javascripts/discourse-plugins/index.js
+++ b/app/assets/javascripts/discourse-plugins/index.js
@@ -15,9 +15,16 @@ function fixLegacyExtensions(tree) {
     getDestinationPath: function (relativePath) {
       if (relativePath.endsWith(".es6")) {
         return relativePath.slice(0, -4);
-      } else if (relativePath.endsWith(".raw.hbs")) {
-        return relativePath.replace(".raw.hbs", ".hbr");
+      } else if (relativePath.includes("/templates/")) {
+        if (relativePath.endsWith(".raw.hbs")) {
+          relativePath = relativePath.replace(".raw.hbs", ".hbr");
+        }
+
+        if (relativePath.endsWith(".hbr")) {
+          return relativePath.replace("/templates/", "/raw-templates/");
+        }
       }
+
       return relativePath;
     },
   });
diff --git a/app/assets/javascripts/discourse/app/templates/badge-selector-autocomplete.hbr b/app/assets/javascripts/discourse/app/raw-templates/badge-selector-autocomplete.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/badge-selector-autocomplete.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/badge-selector-autocomplete.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/category-selector-autocomplete.hbr b/app/assets/javascripts/discourse/app/raw-templates/category-selector-autocomplete.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/category-selector-autocomplete.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/category-selector-autocomplete.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/category-tag-autocomplete.hbr b/app/assets/javascripts/discourse/app/raw-templates/category-tag-autocomplete.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/category-tag-autocomplete.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/category-tag-autocomplete.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/emoji-selector-autocomplete.hbr b/app/assets/javascripts/discourse/app/raw-templates/emoji-selector-autocomplete.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/emoji-selector-autocomplete.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/emoji-selector-autocomplete.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/flat-button.hbr b/app/assets/javascripts/discourse/app/raw-templates/flat-button.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/flat-button.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/flat-button.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/group-selector-autocomplete.hbr b/app/assets/javascripts/discourse/app/raw-templates/group-selector-autocomplete.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/group-selector-autocomplete.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/group-selector-autocomplete.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/hashtag-autocomplete.hbr b/app/assets/javascripts/discourse/app/raw-templates/hashtag-autocomplete.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/hashtag-autocomplete.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/hashtag-autocomplete.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/action-list.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/action-list.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/action-list.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/action-list.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/activity-column.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/activity-column.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/activity-column.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/activity-column.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/category-column.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/category-column.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/category-column.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/category-column.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/participant-groups.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/participant-groups.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/participant-groups.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/participant-groups.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/post-count-or-badges.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/post-count-or-badges.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/post-count-or-badges.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/post-count-or-badges.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/posters-column.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/posters-column.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/posters-column.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/posters-column.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/posts-count-column.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/posts-count-column.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/posts-count-column.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/posts-count-column.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/topic-excerpt.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/topic-excerpt.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/topic-excerpt.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/topic-excerpt.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/topic-list-item.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/topic-list-item.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/topic-list-item.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/topic-list-item.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/unread-indicator.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/unread-indicator.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/unread-indicator.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/unread-indicator.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/list/visited-line.hbr b/app/assets/javascripts/discourse/app/raw-templates/list/visited-line.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/list/visited-line.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/list/visited-line.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/mobile/list/topic-list-item.hbr b/app/assets/javascripts/discourse/app/raw-templates/mobile/list/topic-list-item.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/mobile/list/topic-list-item.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/mobile/list/topic-list-item.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/post/poster-avatar.hbr b/app/assets/javascripts/discourse/app/raw-templates/post/poster-avatar.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/post/poster-avatar.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/post/poster-avatar.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/topic-list-header-column.hbr b/app/assets/javascripts/discourse/app/raw-templates/topic-list-header-column.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/topic-list-header-column.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/topic-list-header-column.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/topic-list-header.hbr b/app/assets/javascripts/discourse/app/raw-templates/topic-list-header.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/topic-list-header.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/topic-list-header.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/topic-post-badges.hbr b/app/assets/javascripts/discourse/app/raw-templates/topic-post-badges.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/topic-post-badges.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/topic-post-badges.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/topic-status.hbr b/app/assets/javascripts/discourse/app/raw-templates/topic-status.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/topic-status.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/topic-status.hbr
diff --git a/app/assets/javascripts/discourse/app/templates/user-selector-autocomplete.hbr b/app/assets/javascripts/discourse/app/raw-templates/user-selector-autocomplete.hbr
similarity index 100%
rename from app/assets/javascripts/discourse/app/templates/user-selector-autocomplete.hbr
rename to app/assets/javascripts/discourse/app/raw-templates/user-selector-autocomplete.hbr
diff --git a/lib/theme_javascript_compiler.rb b/lib/theme_javascript_compiler.rb
index f67009bec3c..c4d15e67558 100644
--- a/lib/theme_javascript_compiler.rb
+++ b/lib/theme_javascript_compiler.rb
@@ -97,8 +97,14 @@ class ThemeJavascriptCompiler
     tree.transform_keys! do |filename|
       if filename.ends_with? ".js.es6"
         filename.sub(/\.js\.es6\z/, ".js")
-      elsif filename.ends_with? ".raw.hbs"
-        filename.sub(/\.raw\.hbs\z/, ".hbr")
+      elsif filename.include? "/templates/"
+        filename = filename.sub(/\.raw\.hbs\z/, ".hbr") if filename.ends_with? ".raw.hbs"
+
+        if filename.ends_with? ".hbr"
+          filename.sub(%r{/templates/}, "/raw-templates/")
+        else
+          filename
+        end
       else
         filename
       end
@@ -168,7 +174,7 @@ class ThemeJavascriptCompiler
       elsif extension == "hbs"
         append_ember_template(module_name, content)
       elsif extension == "hbr"
-        append_raw_template(module_name.sub("discourse/templates/", ""), content)
+        append_raw_template(module_name.sub("discourse/raw-templates/", ""), content)
       else
         append_js_error(filename, "unknown file extension '#{extension}' (#{filename})")
       end