251 lines
7.1 KiB
JavaScript
251 lines
7.1 KiB
JavaScript
import path from "path";
|
|
import fs from "fs";
|
|
import inquirerDirectory from "inquirer-directory";
|
|
|
|
export default function (plop) {
|
|
// starting prompt can be customized to display what you want
|
|
// plop.setWelcomeMessage('[CUSTOM]'.yellow + ' What can I do for you?');
|
|
|
|
// helpers are passed through handlebars syntax and made
|
|
// available for use in the generator templates
|
|
|
|
// adds 4 dashes around some text (yes es6/es2015 is supported)
|
|
plop.addHelper("dashAround", (text) => "---- " + text + " ----");
|
|
|
|
// formats an array of options like you would write
|
|
// it, if you were speaking (one, two, and three)
|
|
plop.addHelper("wordJoin", function (words) {
|
|
return words.join(", ").replace(/(:?.*),/, "$1, and");
|
|
});
|
|
|
|
plop.addHelper("absPath", function (p) {
|
|
return path.resolve(plop.getPlopfilePath(), p);
|
|
});
|
|
|
|
// greet the user using a partial
|
|
plop.addPartial(
|
|
"salutation",
|
|
"{{ greeting }}, my name is {{ properCase name }} and I am {{ age }}.",
|
|
);
|
|
|
|
// load some additional helpers from a module installed using npm
|
|
plop.load("plop-pack-fancy-comments", {
|
|
prefix: "",
|
|
upperCaseHeaders: true,
|
|
commentStart: "",
|
|
commentEnd: "",
|
|
});
|
|
|
|
const delayLog = (msg) => (answers) =>
|
|
new Promise((resolve) => {
|
|
setTimeout(() => resolve(msg), 1000);
|
|
});
|
|
|
|
// setGenerator creates a generator that can be run with "plop generatorName"
|
|
plop.setGenerator("test", {
|
|
description: "this is a test",
|
|
prompts: [
|
|
{
|
|
type: "input",
|
|
name: "name",
|
|
message: "What is your name?",
|
|
validate: function (value) {
|
|
if (/.+/.test(value)) {
|
|
return true;
|
|
}
|
|
return "name is required";
|
|
},
|
|
},
|
|
{
|
|
type: "input",
|
|
name: "age",
|
|
message: "How old are you?",
|
|
validate: function (value) {
|
|
var digitsOnly = /\d+/;
|
|
if (digitsOnly.test(value)) {
|
|
return true;
|
|
}
|
|
return "Invalid age! Must be a number genius!";
|
|
},
|
|
},
|
|
{
|
|
type: "checkbox",
|
|
name: "toppings",
|
|
message: "What pizza toppings do you like?",
|
|
choices: [
|
|
{ name: "Cheese", value: "cheese", checked: true },
|
|
{ name: "Pepperoni", value: "pepperoni" },
|
|
{ name: "Pineapple", value: "pineapple" },
|
|
{ name: "Mushroom", value: "mushroom" },
|
|
{ name: "Bacon", value: "bacon", checked: true },
|
|
],
|
|
},
|
|
],
|
|
actions: [
|
|
`this is a comment`,
|
|
"this is another comment",
|
|
delayLog("delayed thing"),
|
|
delayLog("another delayed thing"),
|
|
delayLog("this was also delayed"),
|
|
{
|
|
type: "add",
|
|
path: "folder/{{dashCase name}}.txt",
|
|
templateFile: "templates/temp.txt",
|
|
abortOnFail: true,
|
|
},
|
|
function customAction(answers) {
|
|
// move the current working directory to the plop file path
|
|
// this allows this action to work even when the generator is
|
|
// executed from inside a subdirectory
|
|
process.chdir(plop.getPlopfilePath());
|
|
|
|
// custom function can be synchronous or async (by returning a promise)
|
|
var existsMsg = "psst {{name}}, change-me.txt already exists";
|
|
var copiedMsg = "hey {{name}}, I copied change-me.txt for you";
|
|
var changeFileName = "change-me.txt";
|
|
var changeFilePath =
|
|
plop.getDestBasePath() + "/folder/" + changeFileName;
|
|
|
|
// you can use plop.renderString to render templates
|
|
existsMsg = plop.renderString(existsMsg, answers);
|
|
copiedMsg = plop.renderString(copiedMsg, answers);
|
|
|
|
if (fs.existsSync(changeFilePath)) {
|
|
// returned value shows up in the console
|
|
return existsMsg;
|
|
} else {
|
|
// do a synchronous copy via node fs
|
|
fs.writeFileSync(
|
|
changeFilePath,
|
|
fs.readFileSync("templates/" + changeFileName),
|
|
);
|
|
return copiedMsg;
|
|
}
|
|
},
|
|
{
|
|
type: "modify",
|
|
path: "folder/change-me.txt",
|
|
pattern: /(-- APPEND ITEMS HERE --)/gi,
|
|
template: "$1\r\n{{name}}: {{age}}",
|
|
},
|
|
{
|
|
type: "modify",
|
|
path: "folder/change-me.txt",
|
|
pattern: /(-- PREPEND ITEMS HERE --)/gi,
|
|
templateFile: "templates/part.txt",
|
|
},
|
|
{
|
|
type: "modify",
|
|
path: "folder/change-me.txt",
|
|
pattern: /## replace name here ##/gi,
|
|
template: "replaced => {{dashCase name}}",
|
|
},
|
|
{
|
|
type: "modify",
|
|
path: "folder/change-me.txt",
|
|
skip(data) {
|
|
if (!data.toppings.includes("mushroom")) {
|
|
// Skip this action
|
|
return "Skipped replacing mushrooms";
|
|
} else {
|
|
// Continue with this action
|
|
return;
|
|
}
|
|
},
|
|
transform(fileContents, data) {
|
|
return fileContents.replace(/mushrooms/g, "pepperoni");
|
|
},
|
|
},
|
|
],
|
|
});
|
|
|
|
// adding a custom inquirer prompt type
|
|
plop.addPrompt("directory", inquirerDirectory);
|
|
|
|
plop.setGenerator("custom-prompt", {
|
|
description: "custom inquirer prompt example",
|
|
prompts: [
|
|
{
|
|
type: "input",
|
|
name: "fileName",
|
|
message: "Pick a file name:",
|
|
validate: function (value) {
|
|
if (/.+/.test(value)) {
|
|
return true;
|
|
}
|
|
return "file name is required";
|
|
},
|
|
},
|
|
{
|
|
type: "directory",
|
|
name: "path",
|
|
message: "where would you like to put this component?",
|
|
basePath: plop.getPlopfilePath(),
|
|
},
|
|
],
|
|
actions: [
|
|
function (data) {
|
|
console.log(data);
|
|
return "yay";
|
|
},
|
|
{
|
|
type: "add",
|
|
path: "{{absPath path}}/{{fileName}}.txt",
|
|
template: "{{absPath path}}/{{fileName}} plopped!",
|
|
},
|
|
],
|
|
});
|
|
|
|
// test with dynamic actions, regarding responses to prompts
|
|
plop.setGenerator("dynamic actions", {
|
|
description: "another test using an actions function",
|
|
prompts: [
|
|
{
|
|
type: "input",
|
|
name: "name",
|
|
message: "What is your name?",
|
|
validate: function (value) {
|
|
if (/.+/.test(value)) {
|
|
return true;
|
|
}
|
|
return "name is required";
|
|
},
|
|
},
|
|
{
|
|
type: "confirm",
|
|
name: "hasPotatoes",
|
|
message: "Do you want potatoes with your burger?",
|
|
},
|
|
],
|
|
actions: function (data) {
|
|
var actions = [
|
|
{
|
|
type: "add",
|
|
path: "folder/{{dashCase name}}-burger.txt",
|
|
templateFile: "templates/burger.txt",
|
|
abortOnFail: true,
|
|
},
|
|
];
|
|
|
|
if (data.hasPotatoes) {
|
|
actions = actions.concat([
|
|
{
|
|
type: "add",
|
|
path: "folder/{{dashCase name}}-potatoes.txt",
|
|
templateFile: "templates/potatoes.txt",
|
|
abortOnFail: true,
|
|
},
|
|
{
|
|
type: "modify",
|
|
path: "folder/{{dashCase name}}-burger.txt",
|
|
pattern: /(!\n)/gi,
|
|
template: "$1Your potatoes: {{dashCase name}}-potatoes.txt",
|
|
},
|
|
]);
|
|
}
|
|
|
|
return actions;
|
|
},
|
|
});
|
|
}
|