upgrade extension to be a prebuilt function map

This commit is contained in:
MichaelWest22 2025-10-31 17:20:23 +13:00
parent 6409d1dd69
commit 9bfdc8d1ba
2 changed files with 11 additions and 12 deletions

View File

@ -53,8 +53,8 @@ var htmx = (() => {
class Htmx {
#extensions = [];
#approvedExtensions = new Set();
#extMethods = new Map();
#approvedExt = new Set();
__mutationObserver = new MutationObserver((records) => this.__onMutation(records));
__actionSelector = "[hx-action],[hx-get],[hx-post],[hx-put],[hx-patch],[hx-delete]";
__boostSelector = "a,form";
@ -124,15 +124,14 @@ var htmx = (() => {
}
}
}
this.#approvedExtensions = new Set(this.config.extensions.split(',').map(s => s.trim()).filter(Boolean));
this.#approvedExt = new Set(this.config.extensions.split(',').map(s => s.trim()).filter(Boolean));
}
defineExtension(name, extension) {
if (!this.#approvedExtensions.delete(name)) {
return false;
}
extension.init?.(this);
this.#extensions.push(extension);
if (!this.#approvedExt.delete(name)) return false;
Object.entries(extension).forEach(([key, value]) => {
if(!this.#extMethods.get(key)?.push(value)) this.#extMethods.set(key, [value]);
});
}
__ignore(elt) {
@ -1392,9 +1391,9 @@ var htmx = (() => {
__triggerExtensions(elt, eventName, detail = {}) {
detail.cancelled = false;
let methodName = eventName.replace(/:/g, '_');
for (const ext of this.#extensions) {
if (ext[methodName]?.(elt, detail) === false || detail.cancelled) {
const methods = this.#extMethods.get(eventName.replace(/:/g, '_')) ?? [];
for (const fn of methods) {
if (fn(elt, detail) === false || detail.cancelled) {
detail.cancelled = true;
return false;
}

View File

@ -211,7 +211,7 @@ describe('Unit Tests', function() {
it("__parseTriggerSpecs throws on unterminated filter", function() {
assert.throws(() => {
htmx.__parseTriggerSpecs('click[ctrlKey');
}, /Unterminated event filter/);
}, /unterminated/);
})
it("__parseTriggerSpecs handles complex real-world spec", function() {