Generators
With hygen
, every time you spot a repetitive task, or a hidden structure in files you're editing, you'll quickly make a new generator.
The moment we add a generator under _templates
, it's ready to use. Here's hello.ejs.t
that was placed in the template folder for you:
To make real mailer, let's copy this file and rename it a bit:
We use a .t
suffix because it disables our editor trying to be smart - use what ever you like. For this example these files represent the HTML and text forms of an email sender.
[[info]] | ###### Creative Freedom | hygen doesn't care about file names or file types in your generator folders. It only cares about folder structure and the contents of your files.
Also note that each template has a frontmatter delimited by a pair of ---
's. In our example, we have a special to:
property which tells hygen
where to put the generated file. We'll see more of these in templates.
Structure
Let's look at our folder structure:
Every time you call it, hygen mailer new
automagically picks up the closest _templates
folder, and renders all files in mailer/new
. In this case it's html.ejs.t
and text.ejs.t
.
As of PR 102 Hygen will recursively walk your template folder, so that you can structure your generators as elaborately as you wish.
[[info]]
|###### Hygen is Contextual
|hygen
simplifies things by asserting "command structure is folder structure".
|
|
|hygen
will pick up the _templates
in your current working directory.
CLI Arguments
To give hygen
arguments via CLI, we follow this pattern:
Any double-dash (--
) argument becomes a variable we can use later in our templates. In the example above we can use name
, message
and version
.
Here's the contents of the template html.ejs.t
with the variables in place:
Try making the text variant yourself by editing text.ejs.t
. Note: you want to put it in the correct place with to:
.
Interactive Prompt
To create an interactive generator, add prompt.js
file to the generator root directory.
For example, to ask for the message
input variable, add to prompt.js
:
The format is based on enquirer. Let's use the message
variable now:
Note that the name
variable has to come from the CLI. To generate, we'll do this:
Which will ask the user for the message
, and generate all contents.
Advanced Interactive Prompt
It's possible to create a a multi-step prompt where you ask some questions, run some computation and ask some more questions.
In addition, it's possible to skip prompting, or re-shape parameters that were given to you from either CLI or prompt, so that you can do it in a central place.
You can "enable" advanced params and prompting by replacing your prompt.js
file with an index.js
file in your action:
Here's how you can use index.js
to build a two-step prompting flow. Instead of exporting an array of question types as with the prompt.js
file, you now need to export an object with a function called prompt
:
The prompt
function gets a data structure with an prompter
field you can use.
For completeness, here is a a more elaborate use of prompts (thanks @jaykoontz).
You can skip prompting conditionally using custom logic:
You can skip physically prompting and use params
to build more sophisticated parameters out of your CLI parameters:
[[info]]
| ###### Params and Prompts are The Same
| If you think about it, prompting for variables or reshaping CLI arguments lead to the same goal: new parameters. But to make a future-proof API, we've separated the two intents to the prompt
and params
functions.
Documenting Your Generators
Since there's a special message
prop you can use in any template, you can use that to build generator help screens. Ultimately, your generator should be documenting itself.
Looking at our generator layout from before, we add a help
action:
Our index.ejs.t
is simply a blank template, with just a message:
prop:
The special |
annotation is a YAML literal block. Should you need it, here's a quick YAML refresher.
Note that in message
you can have a special coloring syntax, which can spice up your self-documenting generators.
Here's a few examples:
For more styles check out chalk.
Selecting Parts of a Generator
In addition to what we've seen until now, hygen
lets the user select parts of a generator.
The complete form is:
Where SUBACTION
is a regular expression or a simple string hygen
uses to pick up the subset of templates you want from a generator.
Using our mailer example, this generates only the text part:
Because we have a file named text.ejs.t
, the string text
in new:text
will match it.
In the same way we could have used a proper regular expression:
That's about it for generators.
That's it for now, you're invited to take a look at the FAQ, and Packages.