1.0.0 • Published 11 months ago

create-by-template v1.0.0

Weekly downloads
-
License
MIT
Repository
github
Last release
11 months ago

project-factory & create-by-template

First package is a library containing the core of the initializer. Second one provides a CLI executable compatible with npm init.

Usage

npm init by-template <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 by-template npm-package my-package

To scaffold a template project use:

npm init by-template 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.

1.0.0

11 months ago

1.0.0-a.9

11 months ago

1.0.0-a.8

11 months ago

1.0.0-a.7

11 months ago

1.0.0-a.6

11 months ago

1.0.0-a.5

11 months ago

1.0.0-a.4

11 months ago

1.0.0-a.3

11 months ago

1.0.0-a.2

11 months ago

1.0.0-a.1

11 months ago