How to guide for writing your first plugin
-
I know there is a way to specify the min version of a (sub-)module with package.json.
But is there a way to specify a module(plugin) version to work with a specific version of NodeBB (for instance)?
This way, the plugin should work regardless the nodebb version and api changes.
-
There is, but only in a "minimum version" capacity. A plugin itself can specify that it has a "minimum version", and NodeBB will throw warnings if that is the case (that does happen now, as some plugins have a minver of "0.4.0", and the latest published NodeBB is still technically v0.3.2.
Perhaps I should add a "safe mode" option, which, if enabled, would skip the loading of incompatible plugins...
-
This is an improvement of psychobunny's example which adds module support. The "callbacked" field in plugin.json may be unnecessary, all the code that I've seen checks that the last argument is a function before it treats it as a callback.
plugin.json:
{ "id": "nodebb-plugin-youtube" , "name": "NodeBB YouTube Plugin" , "description": "NodeBB Plugin that enables users to embed YouTube videos inline in their posts." , "url": "https://github.com/psychobunny/nodebb-plugin-youtube" , "library": "./library.js" , "hooks": [ { "hook": "filter:post.parse" , "method": "parse" , "callbacked": true } ] }
library.js:
/* nodebb modules (eg db) have paths that are relative to the object javascript source file. nodejs modules (eg async) have no path. */ (function(Youtube) { 'use strict' var async = module.parent.require('async') db = module.parent.require('./database') Youtube.parse = function(postContent, callback) { postContent = postContent.replace( /<a href="(?:https?:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=)?(.+)<\/a>/g, '<iframe class="youtube-plugin" width="640" height="360" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>' ) callback(null, postContent) } }(module.exports))
-
Hey
I've been trying to write a plugin and have been following the guide by @psychobunny creating a plugin.js and library file. Then I was stuck since I don't know where to put these files.
According to this https://docs.nodebb.org/et/latest/plugins/create.html I should be able to create a directory under /plugins/nodebb-plugin-my-test-plugin/ and then loaded my NodeBB instance with ./nodebb dev. And can't find any indication that my library is loaded, either in the log or in the admin -> plugin interface.Anyone who can hint what I'm missing.
Best regards?
-
Thanks for the quick replay.
I have actually tried this. Both in normal and dev mode. And both with my ID begin nodebb-plugin-plugin-name and just plugin-name. There is no indication in log or in the admin interface that my plugin is recognised.
My directory looks like this:
/nodebb/node_modules/nodebb-plugin-force-tag$ ls library.js LICENSE plugin.json README.md
And my plugin.json file like this:
{ "id": "nodebb-plugin-force-tag", "name": "NodeBB ForceTag Plugin", "description": "NodeBB Plugin that forces users to tag a post.", "url": "https://github.com/hkirk/nodebb-plugin-force-tag", "library": "./library.js", "hooks": [ { "hook": "action:post.save", "method": "forceTag" } ], }
Anything else i have misunderstood.
Best regards
-
I had the same Issue. Other than mentioned, you have to place a package.json in you plugin-root.
// package.json { "name": "nodebb-plugin-yourname", "version": "0.0.1", "description": "NodeBB plugin", "main": "library.js" }
Otherwise the used npm technique would not be able to "find" it.
PS: How to enter CodeBlock ? XD
-
@psychobunny could
-
@termnml said:
PS: How to enter CodeBlock ? XD
4 spaces like this:
{ "name": "nodebb-plugin-yourname", "version": "0.0.1", "description": "NodeBB plugin", "main": "library.js" }
Or wrap it with
```
top and bottom, like this{ "name": "nodebb-plugin-yourname", "version": "0.0.1", "description": "NodeBB plugin", "main": "library.js" }
Quote my post to see the formatting.
-
@a_5mith said:
@termnml said:
PS: How to enter CodeBlock ? XD
4 spaces like this:
{ "name": "nodebb-plugin-yourname", "version": "0.0.1", "description": "NodeBB plugin", "main": "library.js" }
Or wrap it with
```
top and bottom, like this{ "name": "nodebb-plugin-yourname", "version": "0.0.1", "description": "NodeBB plugin", "main": "library.js" }
Quote my post to see the formatting.
Ha. Thx.
-
I tried following this, and I can't even get the basic "hello, world" logging.
nobebb/node_modules/nodebb-plugin-json-auth/package.json
{ "id": "nodebb-plugin-json-auth", "version": "0.0.1", "name": "NodeBB JSON remote Authentication", "description": "Replaces NodeBB login with a remote location.", "library": "./library.js" }
nobebb/node_modules/nodebb-plugin-json-auth/library.js
console.log('hello, world!');
When I look in Advanced > Logs I can see the "reloading..." and such logged, but there is no "hello, world!". It doesn't appear in Extend > Plugins, either.
-
-
The doc is over two years old. so does contain out of date info.
Refer to the documentation, it'll likely be more up to date. Link to Documentation
-
@a_5mith said:
The doc is over two years old. so does contain out of date info.
Refer to the documentation, it'll likely be more up to date. Link to Documentation
That's where I found that to begin with. It didn't mention needing a package.json https://docs.nodebb.org/en/latest/plugins/create.html so that needs to be added.
-
This post is deleted!