CLI to create React libraries with custom template support
- Introduction
- Features
- Usage
- Configuration
- Template
- Lifecycle Scripts
- Custom Packages
- Contributors
- License
This CLI aims to speed up the developemnt and maintenance of React libraries. It is based on @donysukardi/reactlib-template and installs @donysukardi/reactlib-scripts as dependency.
- Easy to use CLI
- Overridable configuration via kcd-scripts
- Rollup for build process
- Babel for transpilation
- Jest for testing
- Storybook for component development and testing
- Cypress for integration testing
npm install --global @donysukardi/create-reactlib
and run the following command for guided mode
create-reactlib
or pass in arguments with the CLI.
create-reactlib --help
Alternatively, you could use npx without having to install this CLI package manually
npx @donysukardi/create-reactlib
The only compulsory parameter is name
, which is the name of your new package.
parameter | type | default | description |
---|---|---|---|
config |
string | "" | Path to configuration to load |
preact |
boolean | false | Flag to include preact build |
description |
string | "" | Description of the new package |
author |
string | "{{github-username}}" | Author for package.json and README.md |
repo |
string | "{{author}}/{{name}}" | Repository for package.json |
license |
string | "MIT" | License for package.json and README.md |
manager |
string | "npm" | Package manager to use for installation |
semanticallyReleased . |
boolean | true | Flag to indicate whether package version should be 0.0.0-semantically-released |
template |
string | "donysukardi/reactlib-template" | Git repository or local path of template to copy/clone and initialize |
scripts |
string | "{{dest}}/.template/scripts.js" | Path to lifecycle scripts. Ref: Lifecycle Scripts |
packages |
string | "{{dest}}/.template/package.js[on]" | Path to additional packages to install. Ref: Custom Packages |
install |
boolean | true | Flag indicating whether package installation should be performed |
parameter | short | long |
---|---|---|
config |
-c | --config |
preact |
-p | --preact |
description |
-d | --desc |
author |
-a | --author |
repo |
-r | --repo |
license |
-l | --license |
manager |
--npm or --yarn | |
semanticallyReleased . |
-s | --semantically-released |
template |
-t | --template |
scripts |
-S | --scripts |
packages |
-P | --packages |
install |
-x | --no-install |
All the files will be compiled with the parameters merged from the following config,
- Config exported from
.template/config.js
(if any) - Template - Config exported from file in
config
path from CLI (if any) Configuration - Individual config from CLI Configuration
create-reactlib
uses handlebars under the hood.
The following files in the template have special treatments,
- Files with
.tmpl
will have the.tmpl
stripped off during compilation. - Files inside
.template
directory in the root, which will be removed duringcleanup
lifecycle.template/scripts.json
- Default Lifecycle Scripts.template/package.js[on]
- Default Custom Packages.template/config.js
- Default config as described below
This library provides post
hooks for the following lifecycles,
clonecopy
: Copying/Cloning templatetemplate
: Processing templatepackage
: Installing packagescleanup
: Cleaning up template artefactsgit
: Initializing git repository
You will need to export an object with the lifecycle names as the keys, e.g. postclonecopy
, posttemplate
, in the script file.
By default, the library will look for the file in .template/scripts.js
inside the destination path.
Each lifecycle script receives (config
)[#the-config-object] and (tools
)[#tools] as arguments
Object containing library helpers,
{
handlebars,
execa,
fs, // fs-extra
globby,
mkdirp, // make-dir
ora,
pEachSeries, // p-each-series
hostedGitInfo, // hosted-git-info
}
Lifecycle script should return either:
- Object with
title
- custom string to display with spinner andpromise
- function that returns promise to resolve - Promise
Example
// my-reactlib-template/.template/scripts.js
const preTemplate = async (config, tools) => {
const promise = new Promise(resolve => setTimeout(() => resolve(), 2000))
ora.promise(promise, 'Doing something')
await promise
// Do something else here perhaps
}
module.exports = {
pretemplate,
}
The library provides API to include dependencies outside those specified in the template.
You will need to export a JSON with dependencies
and/or devDependencies
keys, just like in package.json
By default, the library will look for the file in .template/package.js
or .template/package.json
inside the destination path.
If you use a js file, you're expected to export a function that will receive config
as argument.
You can leave the version blank to let the library install the latest version for respective package.
{
"devDependencies": {
"react": "",
"react-dom": "",
"prop-types": ""
},
"dependencies": {
"some-package": "^1.4.0"
}
}
Thanks goes to these wonderful people (emoji key):
Dony Sukardi 💻 📖 💡 🤔 👀 |
---|
This project follows the all-contributors specification. Contributions of any kind welcome!
MIT © donysukardi