A collection of utility functions for plop templates.
-
npm
npm install --save-dev @guanghechen/helper-plop
-
yarn
yarn add --dev @guanghechen/helper-plop
This package exposed some inquirer question and answer resolver.
-
NpmPackagePreAnswers
:Name Type Description cwd
string
Current workspace directory isMonorepo
boolean
Whether if this package under a monorepo -
NpmPackagePromptsAnswers
:Name Type Description packageName
string
Npm package name packageAuthor
string
Package author packageVersion
string
Package version packageDescription
string
Package description packageLocation
string
Package location (path relative to the current directory) -
NpmPackageData
:Extended
NpmPackagePreAnswers
andNpmPackagePromptsAnswers
With following Additional properties.Name Type Description packageUsage
string
Package usage repositoryName
string
Git repository name repositoryHomepage
string
Git repository homepage
I recommend you use the following template directory structure:
├── boilerplate/
│ ├── package.json.hbs
│ ├── README.md.hbs
│ ├── rollup.config.js.hbs
│ ├── src
│ │ └── index.ts.hbs
│ ├── tsconfig.json.hbs
│ ├── tsconfig.settings.json.hbs
│ └── tsconfig.src.json.hbs
├── node_modules/
├── cli.js
├── index.js
├── package.json
└── README.md
Where the index.js
exposed a default plop config, such as:
const {
createNpmPackagePrompts,
resolveNpmPackageAnswers,
resolveNpmPackagePreAnswers,
} = require('@guanghechen/helper-plop')
const path = require('path')
const manifest = require('./package.json')
module.exports = async function (plop) {
const preAnswers = await resolveNpmPackagePreAnswers()
const defaultAnswers = { packageVersion: manifest.version }
const { cwd, isMonorepo } = preAnswers
const prompts = await createNpmPackagePrompts(preAnswers, defaultAnswers)
plop.setGenerator('ts-package', {
description: 'create template typescript project',
prompts: [...prompts],
actions: function (_answers) {
const answers = resolveNpmPackageAnswers(preAnswers, _answers)
answers.toolPackageVersion = manifest.version
const resolveSourcePath = p =>
path.normalize(path.resolve(__dirname, 'boilerplate', p))
const resolveTargetPath = p =>
path.normalize(path.resolve(answers.packageLocation, p))
const relativePath = path.relative(answers.packageLocation, cwd)
// Assign resolved data into plop templates.
Object.assign(_answers, answers)
return [
{
type: 'add',
path: resolveTargetPath('package.json'),
templateFile: resolveSourcePath('package.json.hbs'),
},
{
type: 'add',
path: resolveTargetPath('README.md'),
templateFile: resolveSourcePath('README.md.hbs'),
},
!isMonorepo && {
type: 'add',
path: resolveTargetPath('rollup.config.js'),
templateFile: resolveSourcePath('rollup.config.js.hbs'),
},
].filter(Boolean)
},
})
}
And the cli.js
exposed a Node.js CLI script, such as:
#! /usr/bin/env node
const { launch } = require('@guanghechen/helper-plop')
const path = require('path')
launch(
process.argv,
args => ({
configPath: args.plopfile || path.join(__dirname, 'index.js'),
})
)