HelloZeroNet/ZeroNet · error · Error

renderMaquetteFunction was not found

Error message

renderMaquetteFunction was not found

What it means

Projector.unregisterRenderMaquetteFunction removes a render function from its internal registry by scanning for it; if the function was never registered (or already removed), the splice loop completes without finding it and this error is thrown.

Source

Thrown at plugins/UiConfig/media/js/lib/maquette.js:765

            merge: function (domNode, renderMaquetteFunction) {
                projections.push(exports.dom.merge(domNode, renderMaquetteFunction(), projectionOptions));
                renderFunctions.push(renderMaquetteFunction);
            },
            replace: function (domNode, renderMaquetteFunction) {
                var vnode = renderMaquetteFunction();
                createDom(vnode, domNode.parentNode, domNode, projectionOptions);
                domNode.parentNode.removeChild(domNode);
                projections.push(createProjection(vnode, projectionOptions));
                renderFunctions.push(renderMaquetteFunction);
            },
            detach: function (renderMaquetteFunction) {
                for (var i = 0; i < renderFunctions.length; i++) {
                    if (renderFunctions[i] === renderMaquetteFunction) {
                        renderFunctions.splice(i, 1);
                        return projections.splice(i, 1)[0];
                    }
                }
                throw new Error('renderMaquetteFunction was not found');
            }
        };
        return projector;
    };
}));

View on GitHub (pinned to 454c0b2e7e)

Solutions

  1. Only unregister the exact function reference previously registered (avoid bind/arrow wrappers).
  2. Track registration state and skip unregister when already removed.
  3. Wrap unregister in a guard that checks membership before calling.

Example fix

// before
projector.unregisterRenderMaquetteFunction(this.render);
// after
if (this.registered) {
  projector.unregisterRenderMaquetteFunction(this.render);
  this.registered = false;
}
Defensive patterns

Strategy: try-catch

Validate before calling

function isRegistered(projector, fn) {
  try {
    var renderFns = projector.renderFunctions || [];
    return renderFns.indexOf(fn) !== -1;
  } catch (e) { return false; }
}

Type guard

function canUnregister(projector, fn) {
  return typeof fn === 'function' && (projector.renderFunctions || []).indexOf(fn) !== -1;
}

Try / catch

try {
  projector.unregisterRenderMaquetteFunction(this.render);
} catch (e) {
  if (e.message === 'renderMaquetteFunction was not found') { /* already unregistered; ignore */ }
  else { throw e; }
}

Prevention

When it happens

Trigger: Calling projector.unregisterRenderMaquetteFunction(fn) with a function that was never passed to projector.registerRenderMaquetteFunction, or unregistering the same function twice.

Common situations: Component teardown code unregistering handlers that were never registered due to an early error/branch, double-destroy of a component, or unregistering a wrapped/bound copy instead of the exact registered reference.

Related errors


AI-assisted analysis of HelloZeroNet/ZeroNet@454c0b2e7e (2026-09-02). Data as JSON: /api/errors/5f4769c79a6ab3a2. Report an issue: GitHub.