diff --git a/app/assets/javascripts/discourse-plugins/index.js b/app/assets/javascripts/discourse-plugins/index.js
index 0c719a9cafd..ce502bfcf87 100644
--- a/app/assets/javascripts/discourse-plugins/index.js
+++ b/app/assets/javascripts/discourse-plugins/index.js
@@ -62,6 +62,22 @@ function namespaceModules(tree, pluginDirectoryName) {
});
}
+function parsePluginName(pluginRbPath) {
+ const pluginRb = fs.readFileSync(pluginRbPath, "utf8");
+ // Match parsing logic in `lib/plugin/metadata.rb`
+ for (const line of pluginRb.split("\n")) {
+ if (line.startsWith("#")) {
+ const [attribute, value] = line.slice(1).split(":", 2);
+ if (attribute.trim() === "name") {
+ return value.trim();
+ }
+ }
+ }
+ throw new Error(
+ `Unable to parse plugin name from metadata in ${pluginRbPath}`
+ );
+}
+
module.exports = {
name: require("./package").name,
@@ -76,19 +92,31 @@ module.exports = {
);
return pluginDirectories.map((directory) => {
- const name = directory.name;
- const jsDirectory = path.resolve(root, name, "assets/javascripts");
+ const directoryName = directory.name;
+ const pluginName = parsePluginName(
+ path.resolve(root, directoryName, "plugin.rb")
+ );
+ const jsDirectory = path.resolve(
+ root,
+ directoryName,
+ "assets/javascripts"
+ );
const adminJsDirectory = path.resolve(
root,
- name,
+ directoryName,
"admin/assets/javascripts"
);
- const testDirectory = path.resolve(root, name, "test/javascripts");
+ const testDirectory = path.resolve(
+ root,
+ directoryName,
+ "test/javascripts"
+ );
const hasJs = fs.existsSync(jsDirectory);
const hasAdminJs = fs.existsSync(adminJsDirectory);
const hasTests = fs.existsSync(testDirectory);
return {
- name,
+ pluginName,
+ directoryName,
jsDirectory,
adminJsDirectory,
testDirectory,
@@ -109,11 +137,11 @@ module.exports = {
_generatePluginAppTree() {
const trees = this.pluginInfos()
.filter((p) => p.hasJs)
- .map(({ name, jsDirectory }) =>
+ .map(({ pluginName, directoryName, jsDirectory }) =>
this._buildAppTree({
directory: jsDirectory,
- pluginName: name,
- outputFile: `assets/plugins/${name}.js`,
+ pluginName,
+ outputFile: `assets/plugins/${directoryName}.js`,
})
);
return mergeTrees(trees);
@@ -122,11 +150,11 @@ module.exports = {
_generatePluginAdminTree() {
const trees = this.pluginInfos()
.filter((p) => p.hasAdminJs)
- .map(({ name, adminJsDirectory }) =>
+ .map(({ pluginName, directoryName, adminJsDirectory }) =>
this._buildAppTree({
directory: adminJsDirectory,
- pluginName: name,
- outputFile: `assets/plugins/${name}_admin.js`,
+ pluginName,
+ outputFile: `assets/plugins/${directoryName}_admin.js`,
})
);
return mergeTrees(trees);
@@ -154,16 +182,16 @@ module.exports = {
_generatePluginTestTree() {
const trees = this.pluginInfos()
.filter((p) => p.hasTests)
- .map(({ name, testDirectory }) => {
+ .map(({ pluginName, directoryName, testDirectory }) => {
let tree = new WatchedDir(testDirectory);
tree = fixLegacyExtensions(tree);
- tree = namespaceModules(tree, name);
+ tree = namespaceModules(tree, pluginName);
tree = this.processedAddonJsFiles(tree);
return concat(mergeTrees([tree]), {
inputFiles: ["**/*.js"],
- outputFile: `assets/plugins/test/${name}_tests.js`,
+ outputFile: `assets/plugins/test/${directoryName}_tests.js`,
allowNone: true,
});
});
diff --git a/app/assets/javascripts/discourse/lib/bootstrap-json/index.js b/app/assets/javascripts/discourse/lib/bootstrap-json/index.js
index a95655cbf37..ef11f4e9e65 100644
--- a/app/assets/javascripts/discourse/lib/bootstrap-json/index.js
+++ b/app/assets/javascripts/discourse/lib/bootstrap-json/index.js
@@ -386,17 +386,31 @@ module.exports = {
.findAddonByName("discourse-plugins")
.pluginInfos();
- for (const { name, hasJs, hasAdminJs } of pluginInfos) {
+ for (const {
+ pluginName,
+ directoryName,
+ hasJs,
+ hasAdminJs,
+ } of pluginInfos) {
if (hasJs) {
- scripts.push({ src: `plugins/${name}.js`, name });
+ scripts.push({
+ src: `plugins/${directoryName}.js`,
+ name: pluginName,
+ });
}
- if (fs.existsSync(`../plugins/${name}_extras.js.erb`)) {
- scripts.push({ src: `plugins/${name}_extras.js`, name });
+ if (fs.existsSync(`../plugins/${directoryName}_extras.js.erb`)) {
+ scripts.push({
+ src: `plugins/${directoryName}_extras.js`,
+ name: pluginName,
+ });
}
if (hasAdminJs) {
- scripts.push({ src: `plugins/${name}_admin.js`, name });
+ scripts.push({
+ src: `plugins/${directoryName}_admin.js`,
+ name: pluginName,
+ });
}
}
} else {
@@ -420,8 +434,8 @@ module.exports = {
.pluginInfos()
.filter(({ hasTests }) => hasTests)
.map(
- ({ name }) =>
- ``
+ ({ directoryName, pluginName }) =>
+ ``
)
.join("\n");
} else {