UNPKG

1.58 kBJavaScriptView Raw
1'use strict';
2
3var utils = require('./utils');
4
5function toGenerator(name, val, options, parent) {
6 var Generator = parent.constructor;
7 var generator = val;
8
9 if (utils.isValidInstance(val)) {
10 generator.constructor = Generator;
11 } else {
12 generator = new Generator();
13 }
14
15 var fn = decorate(name, val, options, parent);
16 generator.use(fn);
17
18 // cache the generator
19 parent.generators[generator.alias] = generator;
20 parent.generators[generator.name] = generator;
21 parent.generators[name] = generator;
22 parent.emit('generator', generator);
23 return generator;
24}
25
26function decorate(name, val, options, parent) {
27 return function(app) {
28 utils.merge(this.options, parent.options);
29 this.is('generator');
30 this.isApp = true;
31 this.define('parent', parent);
32 parent.run(this);
33
34 this.on('error', parent.emit.bind(parent, 'error'));
35
36 Object.defineProperty(this, 'env', {
37 configurable: true,
38 get: function() {
39 return parent.createEnv(name, val, this.options);
40 }
41 });
42
43 Object.defineProperty(this, 'alias', {
44 configurable: true,
45 get: function() {
46 return this.env.alias;
47 }
48 });
49
50 Object.defineProperty(this, 'name', {
51 configurable: true,
52 get: function() {
53 return this.env.name;
54 }
55 });
56
57 this.define('isMatch', function() {
58 return this.env.isMatch.apply(this.env, arguments);
59 });
60
61 this.define('invoke', function(context, options) {
62 return this.env.invoke.apply(this.env, arguments);
63 });
64 };
65}
66
67module.exports = toGenerator;