UNPKG

2.76 kBJavaScriptView Raw
1'use strict';
2
3/**
4 * ```sh
5 * $ gen
6 * $ gen default
7 * $ gen foo
8 * $ gen foo:default
9 * $ gen foo,bar
10 * $ gen foo bar
11 * $ gen foo bar:baz
12 * $ gen foo:bar,baz
13 * $ gen foo.bar
14 * $ gen foo.bar:baz
15 * $ gen foo.bar baz
16 * $ gen foo.bar baz.qux
17 * $ gen foo.bar:baz qux.fez:default
18 * ```
19 */
20
21// foo:bar,baz
22exports.parse = function(app, name, tasks) {
23 if (tasks && !tasks.length) {
24 tasks = undefined;
25 }
26
27 if (Array.isArray(name)) {
28 var arr = name.reduce(function(acc, val) {
29 return acc.concat(exports.parse(app, val));
30 }, []);
31
32 return arr.reduce(function(acc, obj) {
33 var prev = acc[acc.length - 1];
34 if (prev && prev.name === obj.name) {
35 prev.tasks = prev.tasks.concat(obj.tasks);
36 return acc;
37 }
38 return acc.concat(obj);
39 }, []);
40 }
41
42 if (!tasks && /:/.test(name)) {
43 return exports.parse.apply(null, [app].concat(name.split(':')));
44 }
45
46 if (typeof tasks === 'string') {
47 tasks = tasks.split(',');
48 }
49
50 /**
51 * If `name` and `tasks` was passed, call process, e.g:
52 *
53 * ```sh
54 * $ gen foo:default
55 * $ gen foo bar:baz
56 * $ gen foo:bar,baz
57 * $ gen foo.bar:baz
58 * $ gen foo.bar:baz qux.fez:default
59 * ```
60 */
61
62 if (tasks) {
63 return [{name: name, tasks: tasks}];
64 }
65
66 /**
67 * Otherwise, we have one of the following:
68 *
69 * ```sh
70 * $ gen
71 * $ gen default
72 * $ gen foo
73 * $ gen foo,bar,baz
74 * $ gen foo bar
75 * $ gen foo.bar
76 * $ gen foo.bar baz
77 * $ gen foo.bar baz.qux
78 * ```
79 */
80
81 if (typeof name === 'string') {
82 name = name.split(',');
83 }
84
85 return name.reduce(function(acc, str) {
86 var obj = exports.process(app, str);
87 var prev = acc[acc.length - 1];
88 if (prev && prev.name === obj.name) {
89 prev.tasks = prev.tasks.concat(obj.tasks);
90 return acc;
91 }
92 return acc.concat(obj);
93 }, []);
94};
95
96/**
97 * All we have left at this point is ambiguous args
98 * that could represent tasks or generators:
99 *
100 * ```sh
101 * $ gen
102 * $ gen default
103 * $ gen foo
104 * $ gen foo bar
105 * ```
106 */
107
108exports.process = function(app, str) {
109 if (app.tasks.hasOwnProperty(str)) {
110 return {name: app.isDefault ? 'default' : 'this', tasks: [str]};
111 }
112
113 if (/\./.test(str) || app.generators.hasOwnProperty(str)) {
114 return {name: app.isDefault ? ('default.' + str) : str, tasks: ['default']};
115 }
116
117 // `app` is **not** the default generator
118 if (!app.isDefault) {
119 var generator = app.base.getGenerator('default');
120 if (generator) {
121 return exports.process(generator, str);
122 }
123 }
124
125 // `app` is the default generator
126 var generator = app.base.getGenerator(str);
127 if (generator) {
128 return {name: generator.name, tasks: ['default'], app: generator};
129 }
130
131 // unresolved argument
132 return {_: [str]};
133};