Command-line interface
flecks has a command-line interface for building, linting, testing, and so much more.
Built-in commands
add
Usage: flecks add [options] <packages...>
Add flecks to your application.
Arguments:
packages packages to add
Options:
-d, --dev-dependency add to dev dependencies
-h, --help display help for command
build
Usage: flecks build [options] [target]
Build a target in your application.
Arguments:
target build target (choices: "fleck")
Options:
-d, --no-production dev build
-h, --hot build with hot module reloading
-w, --watch watch for changes
--help display help for command
clean
Usage: flecks clean [options]
Remove node_modules, lock file, and build artifacts.
Options:
-h, --help display help for command
dox
(Implemented by @flecks/dox
)
Usage: flecks dox [options] <subcommand> [output path]
Generate documentation
Arguments:
subcommand Generation type (choices: "docusaurus", "json")
output path Where the files are output
Options:
-r, --rewrite-filenames [pairs...] rewrite filenames
-h, --help display help for command
lint
Usage: flecks lint [options]
Run ESLint.
Options:
-h, --help display help for command
repl
(Implemented by @flecks/repl
)
Usage: flecks repl [options]
Connect to REPL.
Options:
-r, --rlwrap use rlwrap around socat
-h, --help display help for command
test
Usage: flecks test [options] [only]
Run tests.
The options are passed along to the `build` command.
Arguments:
only only run a specific test
Options:
-d, --no-production dev build
-p, --platform [platforms...] platforms to test (default: ["default","server"])
-t, --timeout <ms> timeout (default: 2000)
-v, --verbose verbose output
-w, --watch watch for changes
-h, --help display help for command
Your commands
You can implement your own command by implementing
@flecks/build.commands
in your fleck. Let's
run through the process.
Implement @flecks/build.commands
First, create an application:
- npm
npm init @flecks/app cli_test
Move into the new project and create a fleck:
- npm
npm init @flecks/fleck -w packages/fortune
We're going to be creating a fortune teller command that will tell you when you will find love. 😍
Create a command that takes an option
Commands are gathered during the bootstrap phase and therefore your hook must be implemented in a bootstrap script.
Edit your bootstrap script at packages/fortune/build/flecks.bootstrap.js
to look like this:
export const hooks = {
'@flecks/build.commands': (program) => ({
fortune: {
options: [
program.createOption('-n, --be-nice', 'be nice'),
],
description: 'find your true love',
action: async ({beNice}) => {
console.log(`It will be ${Math.floor(Math.random() * 10) + 2} days until you meet your true love!`);
if (!beNice) {
console.log('You might also stub your toe.');
}
},
},
}),
};
Inspect and invoke your command
Now, invoke flecks like so:
- npm
npx flecks --help
You will see among the commands listed:
fortune [options] find your true love
Run the command with the --help
option:
- npm
npx flecks fortune --help
You will see this output:
Usage: flecks fortune [options]
find your true love
Options:
-n, --be-nice be nice
Let's try it!
- npm
npx flecks fortune --be-nice
You will see something like:
It will be 11 days until you meet your true love!
How about without our option:
- npm
npx flecks fortune
You will see something like:
It will be 7 days until you meet your true love!
You might also stub your toe.
Define arguments
You can also define arguments in addition to options. Let's add an argument that takes the user's name to personalize the output:
export const hooks = {
'@flecks/build.commands': (program, flecks) => {
return {
fortune: {
args: [
program.createArgument('[name]', 'your name')
],
options: [
program.createOption('-n, --be-nice', 'be nice'),
],
description: 'find your true love',
action: async (name = 'person', {beNice}) => {
console.log(`Hey, ${name}. It will be ${Math.floor(Math.random() * 10) + 2} days until you meet your true love!`);
if (!beNice) {
console.log('You might also stub your toe.');
}
},
},
};
},
};
Notice that we added the argument to... the arguments.
Try it again:
- npm
npx flecks fortune --be-nice
You will see e.g.:
Hey, person. It will be 7 days until you meet your true love!
That's because we set the default name to 'person'
in the code above. Let's try passing in a
name:
- npm
npx flecks fortune cha0s
Now the output looks like:
Hey, cha0s. It will be 4 days until you meet your true love!
You might also stub your toe.
Going further
flecks uses Commander.js under the hood to build its CLI. It might be worth checking out their documentation for any more advanced usage.