Plugins
Functionality is added to the CLI runtime
with plugins. Plugins can be yours or the end users.
A plugin is directory that contains 3 optional sub-directories:
commands
templates
extensions
(You can also nest these three directories in build
, for a build pipeline, and Gluegun will still find them. Requires Gluegun 4.1.0+.)
And 1 optional file, which can be <brand>.config.js
, .<brand>rc.json
, or .<brand>rc.yaml
. Replace <brand>
with the name of your CLI.
Other than the 3 directories listed, you're welcome to put any other files or sub-directories in the plugin directory. For example, we include a plugin.js
file in the root of plugins for Ignite CLI to help us load it effectively.
Since multiple plugins can be loaded, they must have unique names. The names are indicated by reading the name
property of the configuration (more on this below), or the plugin directory name itself.
commands
Commands are run from the command line (CLI).
movies actor
Here, the actor
command is run. It is a JS file (src/commands/actor.js
) that exports a structure that looks something like this:
module.exports = {
name: 'actor',
alias: ['a'],
description: 'Displays the name of an actor',
hidden: false,
dashed: false,
run: async (toolbox) => {
const { print } = toolbox
print.info(`Tom Hanks`)
},
}
The name
and description
properties are used in printCommands
calls to print out some help in a table.
alias
allows you to invoke these commands using an alias.
hidden
says whether to show the command in help screens or not.
dashed
lets you run the command as a dashed command, like --version
or -v
.
The run
property should be a function (async or not) that does whatever you want it to. You'll receive the gluegun toolbox
object which contains the core extensions and any additional extensions you've loaded.
templates
Templates are ejs files that get translated by a command into a source code file or similar. For an example, check out the Gluegun CLI itself.
extensions
Extensions are additional functionality that you can monkeypatch onto the toolbox
object. They look something like this:
// extensions/sayhello.js
module.exports = (toolbox) => {
const { print } = toolbox
toolbox.sayhello = () => {
print.info('Hello from an extension!')
}
}
When you have this extension, you can access it in any command file, like this:
// ...
run: async (toolbox) => {
const { sayhello } = toolbox
sayhello()
// or
toolbox.sayhello()
}
async extensions
Extensions maybe also be asynchronous, allowing for things like network calls or other asynchronous operations.
// extensions/getMyData.js
const { asyncCall } = require('@company/lib')
module.exports = async (toolbox) {
const { data } = await asyncCall()
toolbox.myData = data
}
Configuration File
Gluegun uses cosmiconfig to determine configuration. It can be:
- an object under the
<brand>
key in thepackage.json
- a
.<brand>rc
file (containing either yaml or json) .<brand>rc.json
file.<brand>rc.yaml
file<brand>.config.js
JS file that exports an object
In this configuration, you can configure your plugin's name and also set up certain user-overridable defaults.
name
The name of your plugin. If name
does not exist, the default will be the name of the directory.
{
"name": "something"
}
Since many plugins can be installed, we recommend namespacing them with your CLI. For example, for Ignite plugins we have ignite-i18n
, ignite-maps
, etc. For Solidarity, we have solidarity-react-native
and solidarity-elixir
.
A name:
- can contain numbers & letters
- should be lowercase
- spaces-should-have-dashes-if-you-need-them
defaults
Default configuration settings which may be used by your commands and overridden by end users.
{
"semicolons": true,
"colorTheme": ["red", "no", "blue", "aaaaaaaaa"]
}
If you'd like to follow a tutorial to make a plugin, check out the "Making a Plugin" tutorial.