create-based-on

1.0.0 • Public • Published

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 full npm 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.

Package Sidebar

Install

npm i create-based-on

Weekly Downloads

0

Version

1.0.0

License

MIT

Unpacked Size

9.51 kB

Total Files

5

Last publish

Collaborators

  • retueze