npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ubergen

v1.0.0

Published

Quickly throw together generators. params > templates > output;

Downloads

4

Readme

Ubergen

Quickly throw together generators. params > templates > output;

Basic Usage

npm install -g ubergen
  1. Create your config file
// ubergen.config.js

module.exports = {
  generators: []
};
  1. Add a generator
// Templates are just functions that return the template string.
const template = (params) => {
  return `
    function ${name} () {
      return 'Hello I am a function called: ${name}'
    }
  `
}

module.exports = {
  generators: [
    {
      name: 'moduleIndex',
      template: template,
      path: '{{ name }}/index.js', // paths are interpolated with params
      required: [
        'name' // can put required params here, if the user forgets to supply them then will throw an error
      ]
    }
  ]
};
  1. Run your generator (default output is relative your current working directory.)
  ubergen moduleIndex name=Hello

Advanced usage

Composition

Generators can be composed together to generate entire directories or multiple files in one command.

module.exports = {
  generators: [
    {
      name: 'moduleIndex',
      template: moduleIndexTemplate,
      path: 'index.js',
      required: [
        'name' // can put required params here, if the user forgets to supply them then will throw an error
      ]
    },
    {
      name: 'spec',
      template: specFileTemplate,
      path: 'index.spec.js',
    },
    {
      name: 'composedGenerator',
      path: 'module', // this composed generators will write their files relative to this path
      composes: [     // eg. moduleIndex will be written to module/index.js
        'spec',
        'moduleIndex'
      ]
    }
  ]
};

Composed generators are called the same way as other generators. Any parameters that the "child" generators require will also be required for the composed generator:

ubergen composedGenerator name=myModule

Reuse, namespacing & toplevel generators

The examples we've covered above are all examples of "subgenerators". A toplevel (parent) generator groups its generators under a common namespace.

  // ubergen.config.js
  ReactReduxGenerator = require('./react-redux-ubergen');

  module.exports = {
    generators: [
      // top level generator
      reactReduxGenerator({
        componentPath: 'src/components',
        reducerPath: 'src/reducers'
      })
    ]
  }
  // react-redux-ubergen.js
  const templates = require('./templates');

  module.exports = function ReactReduxGenerator(options) {
    return {
      name: 'reactRedux', // required
      generators: [
        {
          name: 'reducer',
          template: templates.reducer,
          path: `${options.reducerPath}/{{ name }}`,
          params: [
            'name'
          ]
        },
        {
          name: 'component',
          template: templates.component,
          path: `${options.componentPath}/{{ name }}`,
          params: [
            'name'
          ]
        }
      ]
    }
  }

To call a subgenerator you have to provide the top level generator's namespace, e.g:

ubergen reactRedux:component name=NavBar

Programmatic use

  const Generator = require('ubergen');
  const generator = Generator(config);

  const name = "mygenerator";
  const params = {
    name: 'hello'
  };

  const rootPath = '/User/Me/project';

  // run a subgenerator
  generator.run(name, params, rootPath);
``