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

base-generators

v0.4.6

Published

Adds project-generator support to your `base` application.

Downloads

87,448

Readme

base-generators NPM version NPM downloads Linux Build Status

Adds project-generator support to your base application.

You might also be interested in base-task.

Table of Contents

(TOC generated by verb using markdown-toc)

Install

Install with npm:

$ npm install --save base-generators

HEADS UP!

The .generateEach method has been deprecated. Use .generate instead.

Usage

var generators = require('base-generators');
var Base = require('base');

// register the plugin before instantiating, to make 
// sure the plugin is called on all Generator instances 
Base.use(generators());
var base = new Base();

Examples

All examples assume the following code is defined:

var Base = require('base');
var generators = require('base-generators');

Base.use(generators());
var base = new Base();

Tasks

Tasks are exactly the same as gulp tasks, and are powered by bach and composer.

Register a task:

base.task('default', function(cb) {
  // do stuff
  cb();
});

Run a task:

base.build('default', function(err) {
  if (err) throw err;
});

Generators

I heard you liked tasks, so I put some tasks in your tasks.

What's a generator?

Generators are functions that are registered by name, and are used to encapsulate and organize code, tasks, other generators, or sub-generators, in a sharable, publishable and easily re-usable way.

In case it helps, here are some live examples.

Register a generator:

base.register('foo', function(app, base) {
  // `app` is the generator's "private" instance
  // `base` is a "shared" instance, accessible by all generators
});

Get a generator:

var foo = base.generator('foo');

Register tasks in a generator:

base.register('foo', function(app, base) {
  app.task('default', function() {});
  app.task('one', function() {});
  app.task('two', function() {});
});

Run a generator's tasks:

The .generate method simply calls the .build method on a specific generator.

To run a generator's tasks, pass the generator name as the first argument, and optionally define one or more tasks as the second argument. (If no tasks are defined, the default task is run.)

// run the "default" task on generator "foo"
base.generate('foo', function(err) {
  if (err) throw err;
  console.log('done!');
});

// or specify tasks
base.generate('foo', ['default'], function() {});
base.generate('foo', ['one', 'two'], function() {});

Alternatively, you can call .build on the generator directly:

// run the "default" task on generator "foo"
base.generator('foo')
  .build('default', function(err) {
    if (err) throw err;
  });

Sub-generators

Sub-generators are just generators that are registered on (or invoked within) another generator instance.

Register sub-generators:

Register generators one, two, and three on generator foo:

base.register('foo', function(app, base) {
  app.register('one', function() {});
  app.register('two', function() {});
  app.register('three', function() {});
});

Get a sub-generator:

Use dot-notation to get a sub-generator:

var one = base.generator('foo.one');

Sub-generators may be nested to any level. In reality, you probably won't write code like the following example, but this only illustrates the point that generators are extremely composable, and can be built on top of or with other generators.

base.register('a', function(a, base) {
  // do stuff
  a.register('b', function(b) {
    // do stuff
    b.register('c', function(c) {
      // do stuff
      c.register('d', function(d) {
        // do stuff
        d.register('e', function(e) {
          // arbitrary task
          e.task('default', function(cb) {
            console.log('e > default!');
            cb();
          });
        });
      });
    });
  });
});

base.getGenerator('a.b.c.d.e')
  .build(function(err) {
    if (err) throw err;
    // 'e > default!'
  });

Register tasks on sub-generators:

base.register('foo', function(app, base) {
  app.register('one', function(one) {
    one.task('default', function() {});
    one.task('a', function() {});
    one.task('b', function() {});
    one.task('c', function() {});
  });

  app.register('two', function(two) {
    two.task('default', function() {});
  });

  app.register('three', function(three) {
    three.task('default', function() {});
  });
});

Run a sub-generator's tasks

// run the `default` task from sub-generator `foo.one`
base.generate('foo.one', function(err) {
  if (err) throw err;
  console.log('done!');
});

Run multiple tasks on a sub-generator:

// run tasks `a`, `b` and `c` on sub-generator `foo.one`
base.generate('foo.one', ['a', 'b', 'c'], function(err) {
  if (err) throw err;
  console.log('done!');
});

In the wild

The following applications use this library:

  • generate: adds a CLI, template rendering, fs methods and generator convenience-methods to base-generators
  • assemble: site generation
  • verb: documentation generation
  • update: renames generators to "updaters", which are used to keep your project up-to-date

API

.register

Alias to .setGenerator.

Example

app.register('foo', function(app, base) {
  // "app" is a private instance created for the generator
  // "base" is a shared instance
});

Params

  • name {String}: The generator's name
  • options {Object|Function|String}: or generator
  • generator {Object|Function|String}: Generator function, instance or filepath.
  • returns {Object}: Returns the generator instance.

.generator

Get and invoke generator name, or register generator name with the given val and options, then invoke and return the generator instance. This method differs from .register, which lazily invokes generator functions when .generate is called.

Example

app.generator('foo', function(app, base, env, options) {
  // "app" - private instance created for generator "foo"
  // "base" - instance shared by all generators
  // "env" - environment object for the generator
  // "options" - options passed to the generator
});

Params

  • name {String}
  • fn {Function|Object}: Generator function, instance or filepath.
  • returns {Object}: Returns the generator instance or undefined if not resolved.

.setGenerator

Store a generator by file path or instance with the given name and options.

Example

app.setGenerator('foo', function(app, base) {
  // "app" - private instance created for generator "foo"
  // "base" - instance shared by all generators
  // "env" - environment object for the generator
  // "options" - options passed to the generator
});

Params

  • name {String}: The generator's name
  • options {Object|Function|String}: or generator
  • generator {Object|Function|String}: Generator function, instance or filepath.
  • returns {Object}: Returns the generator instance.

.getGenerator

Get generator name from app.generators, same as [findGenerator], but also invokes the returned generator with the current instance. Dot-notation may be used for getting sub-generators.

Example

var foo = app.getGenerator('foo');

// get a sub-generator
var baz = app.getGenerator('foo.bar.baz');

Params

  • name {String}: Generator name.
  • returns {Object|undefined}: Returns the generator instance or undefined.

.findGenerator

Find generator name, by first searching the cache, then searching the cache of the base generator. Use this to get a generator without invoking it.

Example

// search by "alias"
var foo = app.findGenerator('foo');

// search by "full name"
var foo = app.findGenerator('generate-foo');

Params

  • name {String}
  • options {Function}: Optionally supply a rename function on options.toAlias
  • returns {Object|undefined}: Returns the generator instance if found, or undefined.

.getSubGenerator

Get sub-generator name, optionally using dot-notation for nested generators.

Example

app.getSubGenerator('foo.bar.baz');

Params

  • name {String}: The property-path of the generator to get
  • options {Object}

Iterate over app.generators and call generator.isMatch(name) on name until a match is found.

Params

  • name {String}
  • returns {Object|undefined}: Returns a generator object if a match is found.

Example

console.log(app.hasGenerator('foo'));

Params

  • name {String}
  • val {Object|Function}
  • returns {Boolean}

For example, if the lookup name is foo, the function might return ["generator-foo", "foo"], to ensure that the lookup happens in that order.

Params

  • name {String}: Generator name to search for
  • options {Object}
  • fn {Function}: Lookup function that must return an array of names.
  • returns {Object}

.extendWith

Extend the generator instance with settings and features of another generator.

Example

var foo = base.generator('foo');
app.extendWith(foo);
// or
app.extendWith('foo');
// or
app.extendWith(['foo', 'bar', 'baz']);

app.extendWith(require('generate-defaults'));

Params

  • app {String|Object}
  • returns {Object}: Returns the instance for chaining.

.toAlias

Create a generator alias from the given name. By default the alias is the string after the last dash. Or the whole string if no dash exists.

Example

var camelcase = require('camel-case');
var alias = app.toAlias('foo-bar-baz');
//=> 'baz'

// custom `toAlias` function
app.option('toAlias', function(name) {
  return camelcase(name);
});
var alias = app.toAlias('foo-bar-baz');
//=> 'fooBarBaz'

Params

  • name {String}
  • options {Object}
  • returns {String}: Returns the alias.

About

Related projects

Contributing

Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.

Contributors

| Commits | Contributor | | --- | --- | | 227 | jonschlinkert | | 6 | doowb |

Building docs

(This document was generated by verb-generate-readme (a verb generator), please don't edit the readme directly. Any changes to the readme must be made in .verb.md.)

To generate the readme and API documentation with verb:

$ npm install -g verb verb-generate-readme && verb

Running tests

Install dev dependencies:

$ npm install -d && npm test

Author

Jon Schlinkert

License

Copyright © 2016, Jon Schlinkert. Released under the MIT license.


This file was generated by verb-generate-readme, v0.2.0, on November 22, 2016.