{"record":{"id":"1c83ea16ffbfc5ff","repo":"HelloZeroNet/ZeroNet","slug":"rendermaquettefunction-was-not-found","errorCode":null,"errorMessage":"renderMaquetteFunction was not found","messagePattern":"renderMaquetteFunction was not found","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"plugins/UiConfig/media/js/all.js","lineNumber":954,"sourceCode":"            merge: function (domNode, renderMaquetteFunction) {\n                projections.push(exports.dom.merge(domNode, renderMaquetteFunction(), projectionOptions));\n                renderFunctions.push(renderMaquetteFunction);\n            },\n            replace: function (domNode, renderMaquetteFunction) {\n                var vnode = renderMaquetteFunction();\n                createDom(vnode, domNode.parentNode, domNode, projectionOptions);\n                domNode.parentNode.removeChild(domNode);\n                projections.push(createProjection(vnode, projectionOptions));\n                renderFunctions.push(renderMaquetteFunction);\n            },\n            detach: function (renderMaquetteFunction) {\n                for (var i = 0; i < renderFunctions.length; i++) {\n                    if (renderFunctions[i] === renderMaquetteFunction) {\n                        renderFunctions.splice(i, 1);\n                        return projections.splice(i, 1)[0];\n                    }\n                }\n                throw new Error('renderMaquetteFunction was not found');\n            }\n        };\n        return projector;\n    };\n}));\n\n\n/* ---- utils/Animation.coffee ---- */\n\n\n(function() {\n  var Animation;\n\n  Animation = (function() {\n    function Animation() {}\n\n    Animation.prototype.slideDown = function(elem, props) {\n      var cstyle, h, margin_bottom, margin_top, padding_bottom, padding_top, transition;","sourceCodeStart":936,"sourceCodeEnd":972,"githubUrl":"https://github.com/HelloZeroNet/ZeroNet/blob/454c0b2e7e000fda7000cba49027541fbf327b96/plugins/UiConfig/media/js/all.js#L936-L972","documentation":"Projector.remove throws this when the renderMaquetteFunction passed to it is not registered in the projector's internal renderFunctions list — i.e. remove was called with a function that was never added via projector.append/render, or the same function was already removed once.","triggerScenarios":"Calling projector.remove(renderFn) with a function that was never passed to projector.append/render; calling remove twice for the same function; passing a different-but-similar closure (e.g. a re-created wrapper) instead of the exact reference used at append time.","commonSituations":"Component unmount logic where the render function reference was lost or recreated; hot-reload scenarios replacing the function identity; double-destroy of a component.","solutions":["Store the exact function reference passed to projector.append and pass that same reference to projector.remove.","Guard against double removal by tracking removed state before calling remove.","Remove the projector.tryRemove variant if available, or wrap remove in a existence check against your own registry of active render functions."],"exampleFix":"// before\nprojector.remove(function () { return render(); }); // new closure, not the registered one\n// after\nvar renderFn = function () { return render(); };\nprojector.append(domNode, renderFn);\n// later, with the same reference:\nprojector.remove(renderFn);","handlingStrategy":"try-catch","validationCode":"var activeRenders = new Set();\nfunction trackedAppend(projector, node, fn) {\n  activeRenders.add(fn);\n  projector.append(node, fn);\n}\nfunction trackedRemove(projector, fn) {\n  if (!activeRenders.has(fn)) return false;\n  activeRenders.delete(fn);\n  projector.remove(fn);\n  return true;\n}","typeGuard":"function isRegistered(fn, registry) {\n  return typeof fn === 'function' && registry.indexOf(fn) !== -1;\n}","tryCatchPattern":"try {\n  projector.remove(renderFn);\n} catch (e) {\n  if (e.message === 'renderMaquetteFunction was not found') {\n    // already removed or never registered; safe to ignore or log\n    return;\n  }\n  throw e;\n}","preventionTips":["Keep the exact function reference used in projector.append so remove uses identity match.","Track registered render functions in your own registry/Set to make removal idempotent.","Avoid recreating wrapper closures around render functions for append/remove calls.","In hot-reload setups, re-register and remove using stable stored references."],"tags":["maquette","projector","lifecycle"],"backgroundTag":"unregistered-render-function","analyzedSha":"454c0b2e7e000fda7000cba49027541fbf327b96","analyzedAt":"2026-09-02T19:46:57.278Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}