Macros 2.0 [Macros] - Add {{hasExtension}} macro, and refactor extension lookup logic (#4948)

* Add {{hasExtension}} macro and refactor extension lookup logic

- Move findExtension() from extensions-slashcommands.js to extensions.js and export it
- Update findExtension() to return object with name and enabled properties instead of just name string
- Add {{hasExtension}} macro to check if an extension is enabled
- Update /extension-state and /extension-exists commands to use refactored findExtension()
- Remove duplicate findExtension() implementation from extensions-slashcommands.js

* Refactor extension action callbacks to use extension object instead of separate name and enabled properties

* fix eslint
This commit is contained in:
Wolfsblvt
2026-01-04 19:37:27 +01:00
committed by GitHub
parent e6ce84d726
commit cd0627bfec
3 changed files with 55 additions and 38 deletions
+16 -1
View File
@@ -4,7 +4,7 @@ import { eventSource, event_types, saveSettings, saveSettingsDebounced, getReque
import { showLoader } from './loader.js';
import { POPUP_RESULT, POPUP_TYPE, Popup, callGenericPopup } from './popup.js';
import { renderTemplate, renderTemplateAsync } from './templates.js';
import { delay, isSubsetOf, sanitizeSelector, setValueByPath, versionCompare } from './utils.js';
import { delay, equalsIgnoreCaseAndAccents, isSubsetOf, sanitizeSelector, setValueByPath, versionCompare } from './utils.js';
import { getContext } from './st-context.js';
import { isAdmin } from './user.js';
import { addLocaleData, getCurrentLocale, t } from './i18n.js';
@@ -331,6 +331,21 @@ export async function disableExtension(name, reload = true) {
}
}
/**
* Finds an extension by name, allowing omission of the "third-party/" prefix.
*
* @param {string} name - The name of the extension to find
* @returns {{name: string, enabled: boolean}|null} Object with name and enabled properties, or null if not found
*/
export function findExtension(name) {
const internalExtensionName = extensionNames.find(extName => {
return equalsIgnoreCaseAndAccents(extName, name) || equalsIgnoreCaseAndAccents(extName, `third-party/${name}`);
});
if (!internalExtensionName) return null;
const isEnabled = !extension_settings.disabledExtensions.includes(internalExtensionName);
return { name: internalExtensionName, enabled: isEnabled };
}
/**
* Loads manifest.json files for extensions.
* @param {string[]} names Array of extension names