Files
pole-book/server/node_modules/plop/tests/examples/javascript/plopfile.js

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;
},
});
}