{"record":{"id":"9ced652b68ce2ca7","repo":"liabru/matter-js","slug":"plugin-register-does-not-implement-all-required-f","errorCode":null,"errorMessage":"Plugin.register: does not implement all required fields.","messagePattern":"Plugin\\.register: does not implement all required fields\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/core/Plugin.js","lineNumber":25,"sourceCode":"var Plugin = {};\n\nmodule.exports = Plugin;\n\nvar Common = require('./Common');\n\n(function() {\n\n    Plugin._registry = {};\n\n    /**\n     * Registers a plugin object so it can be resolved later by name.\n     * @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        }","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/liabru/matter-js/blob/acb99b6f8784c809b940f1d2cf745427e088e088/src/core/Plugin.js#L7-L43","documentation":"Plugin.register validates the object with Plugin.isPlugin, which requires name, version, and install fields (install may be use/defaults variant). If the object lacks these required fields, a warning is emitted; the plugin is still registered (unless it also fails other checks), but Plugin.use/dependency resolution may misbehave. This is a plugin-structure contract violation.","triggerScenarios":"Plugin.register({}) or passing an object missing name/version/install — e.g. registering a plain function, a mistyped module export, or a plugin with version omitted.","commonSituations":"Typo in plugin definition (missing install function), exporting the wrong object, hand-rolled plugins without the required metadata, bundler tree-shaking dropping fields.","solutions":["Ensure the plugin object has name (string), version (semver string), and install (function).","Check what you're passing: Plugin.toString(plugin) is included in the warning and shows the offending object.","Use Plugin.isPlugin(candidate) yourself before registering to validate.","If using the extended form, provide use and defaults instead of install per the plugin spec."],"exampleFix":"// before\nPlugin.register({ name: 'my-plugin' }); // missing version & install\n// after\nPlugin.register({\n  name: 'my-plugin',\n  version: '0.1.0',\n  install: function (base) { /* extend base */ }\n});","handlingStrategy":"validation","validationCode":"if (!Matter.Plugin.isPlugin(candidate)) {\n  throw new TypeError('Plugin must define name, version and install: ' + JSON.stringify(candidate));\n}\nMatter.Plugin.register(candidate);","typeGuard":"function isWellFormedPlugin(p) {\n  return typeof p === 'object' && p !== null &&\n    typeof p.name === 'string' && p.name.length > 0 &&\n    typeof p.version === 'string' &&\n    (typeof p.install === 'function' || typeof p.use === 'function');\n}","tryCatchPattern":null,"preventionTips":["Validate with Matter.Plugin.isPlugin before registering","Always include name, version (semver) and install on plugin objects","Check module.exports points at the plugin object, not a wrapper","Read the full warning: Plugin.toString(plugin) identifies the offending object"],"tags":["plugin","validation","api-contract"],"backgroundTag":"plugin-schema-invalid","analyzedSha":"acb99b6f8784c809b940f1d2cf745427e088e088","analyzedAt":"2026-09-02T21:29:27.057Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}