project-factory
v1.0.4
Published
Project scaffolding library.
Downloads
10
Maintainers
Readme
project-factory
& create-based-on
First package is a library containing the core of the initializer. Second one provides a CLI executable compatible with npm init
.
Usage
npm init based-on <template-specification> [<prefix>]
Examples of <template-specification>
(some templates of mine):
npm-package
github:project-factory-templates/npm-package
(same as the previous one)npm:example
(supports fullnpm install
syntax)https://example.net/
file:../my-local-template
The default value of <prefix>
(where to scaffold) is .
(refers to the CWD). The input is received via prompts
.
Examples
npm init based-on npm-package my-package
To scaffold a template project use:
npm init based-on template-base my-template
Creating custom templates
To create a custom template take a look at my ones. Here's an example:
./
├── js/
│ └── index.js.in
├── ts/
│ ├── index.ts.in
│ └── template.js
├── shared/
│ └── README.md
├── template.js
└── template.deps.json
The template.js
and template.deps.json
files are ignored by default. template.js
may be either a regular configuration file or a router configuration file. *.in
files are input files the variables will be inserted in.
./template.js
import chalk from 'chalk'
export default {
routes: [
{
directory: 'js',
message: chalk.yellow('JavaScript')
},
{
directory: 'ts',
message: chalk.blue('TypeScript')
}
],
// https://www.npmjs.com/prompts
message: 'Select a language:',
promptScript: [
{
// this message will be inserted in one of selected index.* files
name: 'MSG',
type: 'text',
message: 'Enter a message:'
}
]
sharedDirectories: ['shared']
}
./template.deps.json
{
"chalk": "^5.0.0"
}
./js/index.js.in
console.log('From index.js: <(MSG)')
./ts/index.ts.in
console.log('From index.ts: <(MSG)')
./ts/template.js
import chalk from 'chalk'
export default {
onScaffolded: () => console.log(chalk.red('deps are shared across the configs'))
}
The input file extension and variable insertion pattern are overridable. If you'd like to see the full list of options this library provides, you may visit my GitHub repository.
Quicknotes about execution context
The term "execution context" is used to describe an environment the configurations will be executed in. In current implementation, the library creates a temporary directory (roughly, ${tmpdir()}/${randomUUID()}
), installs there all the deps. Done, the execution context is created. To execute a script, the library copies the configuration (roughly, ${temporaryDirectory}/${randomUUID()}.js
, to prevent import
-caching) and imports it, just to execute. The execution context is destroyed (the temporary directory handle is closed, the directory is deleted) once the template configuration has been resolved.