Plugin Development
Introduction #
So you want to make a plugin for JD CLI?
Plugins are imported directly by the CLI, so you have the full power of the Deno ecosystem.
If you have never used Deno before, you might want to consider reading Deno Manual and a gentle introduction to the runtime and it’s features.
Before developing your own plugins, you’ll want to read how to install plugins.
ALL Johnny Decimal CLI Commands (except the
cdcommand) are plugins. Even the built-in ones! You can look at the built-in commands’ source code for reference (or even override our existing commands by using the samename)!
Basic Structure #
The easiest way to understand how plugin command works is to see an example. You can code plugins in both Javascript and Typescript. Here is an example using Javascript (or look at the released typescript version):
/**
* .jd/plugins/sublime/main.js
*
* Opens a location in Sublime Text!
* `jd sublime 20.21`
* `jd subl 20.21`
*/
const sublimeCommand = {
name: 'sublime',
alias: ['subl'],
usage: 'jd subl <location>',
description: 'Open location in Sublime',
async fn([str] = []) {
const [location] = await this.findLocationsById(str)
// Logs the location our command is using
console.log(location.path)
// Runs a global sh command `open -a "Sublime Text" {location.path}`
await Deno.run({
cmd: ['open', '-a', 'Sublime Text', location.path],
stdin: 'piped',
stdout: 'piped',
stderr: 'piped',
}).status()
},
}
export default sublimeCommand
The structure of this Plugin Command is something like this:
| property | description |
|---|---|
name |
Basically the key used for registering the plugin. So for this example, JD CLI will run this command if the user inputs `jd sublime`. |
alias |
An array of other names you can use to call this command. So this plugin can also be used by running `jd subl` |
usage |
Logged in JD CLI's internal `help` command. You will see these if you run `jd --help`. |
description |
Logged in JD CLI's internal `help` command. You will see these if you run `jd --help`. |
fn |
The actual command functionality. Notice the call to `this`. `fn` is bound to the JD Directory context. This is how we make it easy to interact with the JD filesystem. |
Using Directory and Location #
The core of making command plugins in JD CLI is understanding the usage of Directory and Location.
Directory
In our Sublime Plugin, you’ll notice the context call await
this.findLocationsById. This is using the Johnny Decimal
Directory. For all plugins, this is bound to
the context of the fn method.
This is the main tool you interact with to use JD utilities.
Location
This describes a location in the JD filesystem. It includes 3 separate
ids for Area, Category, and Item.
There are mainly two entities to import:
import { Location, Directory } from
"https://deno.land/x/johnny_decimal/mod.ts"