Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/fardjad/node-templgen
Extensible template based file generator
https://github.com/fardjad/node-templgen
boilerplate cli-library code-generation code-generator ejs file-generator generate generator node-module scaffold scaffolding template typescript-library
Last synced: about 1 month ago
JSON representation
Extensible template based file generator
- Host: GitHub
- URL: https://github.com/fardjad/node-templgen
- Owner: fardjad
- License: mit
- Created: 2023-08-10T11:03:59.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-11-12T01:07:55.000Z (about 2 months ago)
- Last Synced: 2024-11-14T12:03:35.832Z (about 1 month ago)
- Topics: boilerplate, cli-library, code-generation, code-generator, ejs, file-generator, generate, generator, node-module, scaffold, scaffolding, template, typescript-library
- Language: TypeScript
- Homepage: https://www.npmjs.com/package/templgen
- Size: 1.55 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
TemplGen is a small and extensible template based file generator module that
provides a simple API for creating code scaffolding tools.It borrows some ideas from [Nx][1] but it is meant to be used as a
building block for creating CLI tools rather than being a full fledged tool
itself.## Features
- ESM and CommonJS support
- Support for copying binary files as well as rendering template files
- Variable substitution in file names
- Use EJS (by default) or [any other template engine][2]
- Overridable file system methods. You can [override][3] the default functions used
to create directories, read files, write files, and copy files. That is
useful for [testing][4], logging, implementing interactive prompts, etc.## Installation
```bash
npm install --save templgen
```## Usage
```javascript
import { FileGenerator } from "templgen";const sourceDirectory = "/source/directory";
const targetDirectory = "/target/directory";
const files = [
// Will be copied to /target/directory/copy_as_is
"/source/directory/copy_as_is",
// Will be rendered with EJS and written to /target/directory/render_with_ejs
"/source/directory/render_with_ejs.template",
// Will be copied to /target/directory/subdir/replaced.txt
"/source/directory/subdir/__variable__.txt",
];
const variables = {
variable: "replaced",
};const fileGenerator = new FileGenerator();
await fileGenerator.generate(
sourceDirectory,
targetDirectory,
files,
variables,
);
```See [example](./example) for a working example.
### Advanced Usage
#### Custom File System Functions
```javascript
import fs from "node:fs";
import { FileGenerator } from "templgen";const sourceDirectory = "/source/directory";
const targetDirectory = "/target/directory";
const files = ["/source/directory/render_with_ejs.template"];
const variables = {
variable: "replaced",
};const myWriteFile = async (filePath, ...arguments_) => {
console.log(`Writing file: ${path.relative(targetDirectory, filePath)}`);
// you can show a prompt here
return fs.promises.writeFile(filePath, ...arguments_);
};
const myCopyFile = async (sourcePath, destinationPath, ...arguments_) => {
console.log(
`Writing file: ${path.relative(targetDirectory, destinationPath)}`,
);
// you can show a prompt here
return fs.promises.copyFile(sourcePath, destinationPath, ...arguments_);
};const fileGenerator = new FileGenerator({
writeFile: myWriteFile,
copyFile: myCopyFile,
// you can override mkdir and readFile too
});await fileGenerator.generate(
sourceDirectory,
targetDirectory,
files,
variables,
);
```#### Custom Template Engine
```javascript
import Handlebars from "handlebars";
import { FileGenerator } from "templgen";const sourceDirectory = "/source/directory";
const targetDirectory = "/target/directory";
const files = [
// Will be rendered with custom template engine and written to /target/directory/render_with_custom
"/source/directory/render_with_custom.template",
];
const variables = {
variable: "replaced",
};const fileGenerator = new FileGenerator({
render: async (template, variables, paths) => {
// The paths in the paths object can be used for caching, logging, etc.
console.log(paths);return Handlebars.compile(template)(variables);
},
});await fileGenerator.generate(
sourceDirectory,
targetDirectory,
files,
variables,
);
```[1]: https://nx.dev/core-features/plugin-features/use-code-generators
[2]: #custom-template-engine
[3]: #custom-file-system-functions
[4]: ./src/index.test.ts