1 | 'use strict';
|
2 |
|
3 | var utils = require('./utils');
|
4 |
|
5 | function 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 |
|
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 |
|
26 | function 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 |
|
67 | module.exports = toGenerator;
|