{"record":{"id":"5fe799505e6cb215","repo":"liabru/matter-js","slug":"plugin-register-can-not-be-downgraded-to","errorCode":null,"errorMessage":"Plugin.register: can not be downgraded to","messagePattern":"Plugin\\.register: can not be downgraded to","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/core/Plugin.js","lineNumber":37,"sourceCode":"     * @method register\n     * @param plugin {} The plugin to register.\n     * @return {object} The plugin.\n     */\n    Plugin.register = function(plugin) {\n        if (!Plugin.isPlugin(plugin)) {\n            Common.warn('Plugin.register:', Plugin.toString(plugin), 'does not implement all required fields.');\n        }\n\n        if (plugin.name in Plugin._registry) {\n            var registered = Plugin._registry[plugin.name],\n                pluginVersion = Plugin.versionParse(plugin.version).number,\n                registeredVersion = Plugin.versionParse(registered.version).number;\n\n            if (pluginVersion > registeredVersion) {\n                Common.warn('Plugin.register:', Plugin.toString(registered), 'was upgraded to', Plugin.toString(plugin));\n                Plugin._registry[plugin.name] = plugin;\n            } else if (pluginVersion < registeredVersion) {\n                Common.warn('Plugin.register:', Plugin.toString(registered), 'can not be downgraded to', Plugin.toString(plugin));\n            } else if (plugin !== registered) {\n                Common.warn('Plugin.register:', Plugin.toString(plugin), 'is already registered to different plugin object');\n            }\n        } else {\n            Plugin._registry[plugin.name] = plugin;\n        }\n\n        return plugin;\n    };\n\n    /**\n     * Resolves a dependency to a plugin object from the registry if it exists. \n     * The `dependency` may contain a version, but only the name matters when resolving.\n     * @method resolve\n     * @param dependency {string} The dependency.\n     * @return {object} The plugin if resolved, otherwise `undefined`.\n     */\n    Plugin.resolve = function(dependency) {","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/liabru/matter-js/blob/acb99b6f8784c809b940f1d2cf745427e088e088/src/core/Plugin.js#L19-L55","documentation":"Plugin.register was given a plugin whose name is already registered with a HIGHER version; the downgrade is refused (the higher-version registered plugin is kept) and a warning is emitted. This protects you from accidentally overwriting a newer plugin with an older copy.","triggerScenarios":"Registering the same plugin.name with a smaller semver than what is already in Plugin._registry — typically loading an old plugin file after a new one.","commonSituations":"Stale cached script loaded after the updated one; two dependencies pinning different plugin versions; rollback attempts at runtime.","solutions":["Ensure only one (the newest) version of the plugin is loaded/registered.","Check registered versions via Plugin._registry or Plugin.toString output in the warning.","Update the old copy to the newer version, or reorder includes so the newest loads last if last-write-wins is desired."],"exampleFix":"// before\nPlugin.register(pNew); // v2.0.0\nPlugin.register(pOld); // v1.0.0 -> downgrade refused\n// after\nPlugin.register(pNew); // only register the newest version","handlingStrategy":"validation","validationCode":"const existing = Matter.Plugin._registry[plugin.name];\nif (!existing || Matter.Plugin.versionParse(plugin.version).number >= Matter.Plugin.versionParse(existing.version).number) {\n  Matter.Plugin.register(plugin);\n} else {\n  console.warn('Skipping downgrade of', plugin.name, 'to', plugin.version);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never load stale/older copies of a plugin after the new one","Check load order of script tags; newest should be the only one","Audit dependency trees for conflicting plugin versions"],"tags":["plugin","versioning","duplicate"],"backgroundTag":"plugin-version-conflict","analyzedSha":"acb99b6f8784c809b940f1d2cf745427e088e088","analyzedAt":"2026-09-02T21:29:27.057Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}