hygen vs plop vs sao vs yeoman-generator
Code Generation Tools
hygenplopsaoyeoman-generatorSimilar Packages:

Code Generation Tools

Code generation tools streamline the development process by automating repetitive tasks, enabling developers to create boilerplate code quickly and efficiently. These tools enhance productivity by reducing manual coding efforts, ensuring consistency across projects, and allowing for easy customization of templates. They are particularly useful in large projects where maintaining uniformity and adhering to best practices is crucial. Each tool has its unique features and design philosophies, catering to different development needs and preferences.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
hygen05,986137 kB102-MIT
plop07,635164 kB74a month agoMIT
sao01,050-676 years agoMIT
yeoman-generator01,261140 kB63 days agoBSD-2-Clause

Feature Comparison: hygen vs plop vs sao vs yeoman-generator

Customization

  • hygen:

    Hygen allows developers to create custom templates using simple JavaScript functions, making it easy to tailor the generated code to specific project needs. Its straightforward syntax and file structure enable quick adjustments without extensive configuration.

  • plop:

    Plop offers extensive customization options, allowing developers to define their own generators and templates in a JSON format. This flexibility makes it possible to create highly specialized code structures that align with project requirements.

  • sao:

    Sao supports a variety of templates and allows for easy customization through its configuration files. It is designed for rapid prototyping, enabling developers to quickly adapt templates to fit their evolving needs.

  • yeoman-generator:

    Yeoman provides a powerful generator ecosystem, allowing developers to create complex scaffolding solutions. Its customization capabilities are extensive, making it suitable for large-scale applications that require detailed setups.

Ease of Use

  • hygen:

    Hygen is designed for ease of use, with a minimal setup process that allows developers to start generating code quickly. Its command-line interface is intuitive, making it accessible for developers of all skill levels.

  • plop:

    Plop has a gentle learning curve, making it easy for developers to define their own generators. Its straightforward approach to creating templates ensures that even those new to code generation can get started without much hassle.

  • sao:

    Sao is user-friendly, focusing on rapid setup and prototyping. Its simple command-line interface allows developers to generate projects quickly, making it ideal for those who prioritize speed and efficiency.

  • yeoman-generator:

    Yeoman Generator has a steeper learning curve due to its comprehensive feature set. However, once mastered, it provides powerful scaffolding capabilities that can significantly enhance productivity in larger projects.

Integration

  • hygen:

    Hygen integrates seamlessly into existing projects, allowing developers to generate files directly within their project structure. This integration minimizes disruption and helps maintain consistency across the codebase.

  • plop:

    Plop can be easily integrated into various build systems and workflows, making it a versatile choice for developers looking to enhance their existing processes with custom code generation capabilities.

  • sao:

    Sao is designed for integration with other tools and frameworks, enabling developers to quickly prototype and iterate on their projects. Its flexibility allows it to fit into various development environments.

  • yeoman-generator:

    Yeoman Generator is built for integration with multiple tools and frameworks, providing a comprehensive solution for managing project dependencies and configurations. It is particularly effective in larger applications that require robust scaffolding.

Community and Ecosystem

  • hygen:

    Hygen has a growing community and a collection of templates available for various use cases. Its focus on simplicity and speed has attracted a dedicated user base, contributing to its evolving ecosystem.

  • plop:

    Plop has an active community that shares generators and templates, making it easier for developers to find resources and examples. Its flexibility encourages collaboration and sharing of custom solutions.

  • sao:

    Sao benefits from a supportive community that emphasizes rapid prototyping and experimentation. Its ecosystem includes various templates and tools that cater to developers looking for quick solutions.

  • yeoman-generator:

    Yeoman Generator boasts a large and established community with a rich ecosystem of generators. This extensive support network provides developers with a wealth of resources and templates to enhance their projects.

Performance

  • hygen:

    Hygen is lightweight and optimized for performance, allowing for quick file generation without significant overhead. This efficiency is particularly beneficial in large projects where speed is crucial.

  • plop:

    Plop performs well in generating files, with minimal impact on build times. Its focus on simplicity ensures that it remains efficient even when handling complex templates.

  • sao:

    Sao is designed for rapid prototyping, emphasizing performance in generating and managing templates. Its architecture supports quick iterations, making it suitable for fast-paced development environments.

  • yeoman-generator:

    Yeoman Generator is robust but can introduce some overhead due to its comprehensive feature set. However, when used effectively, it can significantly improve productivity in larger projects.

How to Choose: hygen vs plop vs sao vs yeoman-generator

  • hygen:

    Choose Hygen if you need a fast, lightweight solution for generating files and templates directly in your project directory. It is particularly useful for developers who prefer a simple setup and want to integrate code generation seamlessly into their existing workflow without much overhead.

  • plop:

    Select Plop if you want a highly customizable code generator that allows you to define your own generators and templates. It is ideal for projects where you need to create specific file structures or boilerplate code tailored to your unique requirements, offering a balance between simplicity and flexibility.

  • sao:

    Opt for Sao if you are looking for a tool that emphasizes rapid prototyping and supports a wide range of templates and generators. It is particularly useful for projects that require quick iterations and experimentation with different setups, making it a great choice for startups and agile teams.

  • yeoman-generator:

    Choose Yeoman Generator if you are working on larger projects that require a comprehensive scaffolding solution. Yeoman provides a robust ecosystem with a wide array of generators and is suitable for complex applications where you need to manage dependencies and configurations effectively.

README for hygen

hygen logo

build status npm version

hygen is the simple, fast, and scalable code generator that lives in your project.

Features

  • ✅ Build ad-hoc generators quickly and full on project scaffolds.
  • ✅ Local generators per project (and global, if you must)
  • ✅ Built-in scaffolds to quickly create generators
  • ✅ Full logic templates and rendering
  • ✅ Prompts and flows for taking in arguments
  • ✅ Automatic CLI arguments
  • ✅ Adding new files
  • ✅ Injecting into existing files
  • ✅ Running shell commands
  • ✅ Super fast, constantly optimized for speed

New in hygen v4.0.0: a positional NAME parameter. Now you can use $ hygen component new MyComponent instead of $ hygen component new --name MyComponent.

Used By

Wix     Airbnb     Mercedes Benz AG     Open Data Institute     Ableneo   City of Amsterdam     Accenture   Birdie     Kind     Ackee   Aerian Studios  Food and Agriculture Organization of the UN Cape Cod Commision   Tweak Things     Crema     Cureon     Astrocoders     Vega/IDL   Sporty Spots    Thrashplay   8base    Instamotionh Biotope Frontend Labs Swydo Gridsome Rosem LaboratorySheffield Hallam University Hackoregon Chilly Design

Scale Leap Chat Logs Stelace Echobind.

Quick Start

Hygen can be used to supercharge your workflow with Redux, React Native, Express and more, by allowing you avoid manual work and generate, add, inject and perform custom operations on your codebase.

If you're on macOS and have Homebrew:

$ brew tap jondot/tap
$ brew install hygen

If you have node.js installed, you can install globally with npm (or Yarn):

$ npm i -g hygen

If you like a no-strings-attached approach, you can use npx without installing globally:

$ npx hygen ...

For other platforms, see releases.

Initialize hygen in your project (do this once per project):

$ cd your-project
$ hygen init self

Build your first generator, called mygen:

$ hygen generator new mygen

Loaded templates: _templates
       added: _templates/mygen/new/hello.ejs.t

Now you can use it:

$ hygen mygen new

Loaded templates: _templates
       added: app/hello.js

You've generated content into the current working directory in app/. To see how the generator is built, look at _templates (which you should check-in to your project from now on, by the way).

You can build a generator that uses an interactive prompt to fill in a variable:

$ hygen generator with-prompt mygen

Loaded templates: _templates
       added: _templates/mygen/with-prompt/hello.ejs.t
       added: _templates/mygen/with-prompt/prompt.js

Done! Now let's use mygen:

$ hygen mygen with-prompt
? What's your message? hello

Loaded templates: _templates
       added: app/hello.js

Use a template repo

Want to start from a repo?

$ hygen init repo antfu/vitesse --to my-folder

Want to start from an existing repo on an existing project?

$ mkdir your-project && cd your-project
$ hygen init repo antfu/vitesse

What's Next?

Go to the documentation to get to know the rest of Hygen and generators.

If you're in a hurry:

  • To learn how to edit generator templates, look here
  • To see how to use generators look here
  • Take a look at the ecosystem and tooling built around Hygen.

A Different Kind of a Generator

hygen is a scalable generator. It has developer and team ergonomics as first priority.

It avoids "blessed" or dedicated projects that codifies code generation, which before you know it, become a product you build, needs testing, CI, separate pull request reviews, and ultimately sucks up your time and becomes this super hated thing no one likes to touch anymore.

Plus, since they are not the product you are building they become notoriously hard to reason about.

Scratch Your Own Itch

Because hygen templates live in your project, it cuts the time from having an itch for generating code (Redux, anyone?) in your current project to code generated with it and others benefiting from it.

Template Locality

hygen picks up a local _templates folder at any folder level of your project you're working from.

This is important because:

  • Templates are project-local. A git clone of the project fetches all generators as well.
  • Different generators can be tucked in different parts of the project, making it contextual.
  • Template locality is scalable; different teams can maintain different generators.
  • When you change your code, you can make changes in the template and pack in the same commit, to be reviewed and merged in the same PR (as opposed to installing different "plugins" or different templates from out-of-repo places).

And yet, if you don't like project-local templates:

  • You can have a global _templates folder (maybe a central git repo you maintain?) by populating an environment variable HYGEN_TMPLS
  • You can build a custom generator of your own with hygen at its core, and pack your own templates with it.

Folder Structure is Command Structure

The templates folder structure maps directly to the command structure:

$ hygen worker new jobrunner

For this command, hygen worker new maps to _templates/worker/new and all files within worker/new are rendered.

Template parameters are given with --flag VALUE, as many as you'd like. In this example we've set a parameter named name to the value jobrunner.

Subcommands

A subcommand is a file inside a your folder structure. So if the structure is this:

_templates/
    worker/
      new/
        index.html.ejs
        setup.html.ejs

And you only want setup, you can run:

$ hygen worker new:setup

You can also use the subcommand as a regular expression so, these will do the same:

$ hygen worker new:se
$ hygen worker new:se.*

Frontmatter for Decluttering

Here's how a template looks like (in our example, index.ejs.t). Templates bodies are ejs:

---
to: app/workers/<%=name%>.js
---

class <%= h.capitalize(name) %> {
    work(){
        // your code here!
    }
}

The first part of the template is a front matter, idea borrowed from Markdown, this is the metadata part of a hygen template and is part of the reason of why your templates will feel more lightweight and flexible.

All frontmatter metadata are also run through the template engine so feel free to use variables in the frontmatter as you wish.

There's one required metadata variable: to. to points to where this file will be placed (folders are created as needed).

Case changing

hygen provides ability to semantic case changing with change-case library, it's simple to use and very easy to understand.

There is a usecase for react based components generation:

---
to: components/<%= name %>/index.jsx
---
import React from 'react'

export const <%= name %> = ({ children }) => (
  <div className="<%= h.changeCase.paramCase(name) %>">{children}</div>"
)

With name HelloWorld will be compiled to:

import React from 'react'

export const HelloWorld = ({ children }) => (
  <div className="hello-world">{children}</div>"
)

You can see the full list here.

Addition, Injection, and More

By default templates are 'added' to your project as a new target file, but you can also choose to inject a template into an existing target file.

For this to work, you need to use inject: true with the accompanied inject-specific props.

---
to: package.json
inject: true
after: dependencies
skip_if: react-native-fs
---
"react-native-fs":"*",

This template will add the react-native-fs dependency into a package.json file, but it will not add it twice (see skip_if).

Here are the available mutually-exclusive options for where to inject at:

  • before | after - a regular expression / text to locate. The inject line will appear before or after the located line.
  • prepend | append - add a line to start or end of file respectively.
  • line_at - add a line at this exact line number.

You can guard against double injection:

  • skip_if - a regular expression / text. If exists injection is skipped.

Also you can insert or remove empty line to injection body. That feature very useful if your editor or formatter automatically insert blank line at the end of file on save:

  • eof_last - if falsy - trim blank line from the end of injection body, if truthy - insert it.

Build Your Own

hygen is highly embeddable. You should be able to use it by simply listing it as a dependency and having this kind of workflow in your binary.

const { runner } = require('hygen')
const Logger = require('hygen/dist/logger')
const path = require('path')
const defaultTemplates = path.join(__dirname, 'templates')

runner(process.argv.slice(2), {
  templates: defaultTemplates,
  cwd: process.cwd(),
  logger: new Logger.default(console.log.bind(console)),
  createPrompter: () => require('enquirer'),
  exec: (action, body) => {
    const opts = body && body.length > 0 ? { input: body } : {}
    return require('execa').shell(action, opts)
  },
  debug: !!process.env.DEBUG
})

Development

The Hygen codebase has a functional style where possible. This is because naturally, it feeds parameters and spits out files. Try to keep it that way.

Running hygen locally, rigged to your current codebase (note the additional -- to allow passing flags)

$ yarn hygen -- mailer new foobar

Running tests in watch mode:

$ yarn watch

Metaverse Testing

The easiest way to make an impact is to use the built-in metaverse tests suite, and then add the tests here.

The idea here is to copy templates from any project that use hygen and to test that it works at all times. This keeps tabs on the hygen universe / ecosystem (nicknamed metaverse) and makes sure this test suite breaks before hygen clients break.

Internal Testing

Start Up Speed Testing

Many generators become painfully slow to use as the thing you want to generate grow (because, real life),

This is why hygen takes speed as a first class citizen, and sports a dedicated start-up timing suite:

$ yarn test:require

In addition, thought is given to which dependencies to take in, how their file structure fan out and what kind of disk access (due to require) would hygen ultimately have when we run it. This is recorded with every test run.

Bundling a single file was evaluated (and the infrastructure is still there, using webpack) and wasn't faster than what we have right now.

Contributing

Fork, implement, add tests, pull request, get my everlasting thanks and a respectable place here :).

Thanks:

To all Contributors - you make this happen, thanks!

Copyright

Copyright (c) 2018 Dotan Nahum @jondot. See LICENSE for further details.