1 | #!/usr/bin/env node
|
2 |
|
3 | require('lazy-ass');
|
4 | var check = require('check-more-types');
|
5 |
|
6 | var log = require('debug')('cli');
|
7 |
|
8 | var join = require('path').join;
|
9 | var fileExists = require('fs').existsSync;
|
10 | var fromThis = join.bind(null, __dirname);
|
11 | var pkg = require(fromThis('../package.json'));
|
12 | console.log('%s@%s - %s\n %s %s\n cwd %s',
|
13 | pkg.name, pkg.version,
|
14 | pkg.description,
|
15 | JSON.stringify(pkg.author), pkg.homepage,
|
16 | process.cwd());
|
17 |
|
18 | var resolve = require('path').resolve;
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 | var fakeGruntfile = 'fake-gruntfile.js';
|
28 | var resolved = resolve(fakeGruntfile);
|
29 |
|
30 |
|
31 | var Module = require('module');
|
32 | var _resolveFilename = Module._resolveFilename;
|
33 | console.assert(typeof _resolveFilename === 'function');
|
34 | Module._resolveFilename = function fakeResolveFilename(request, parent) {
|
35 | if (request === resolved) {
|
36 | return resolved;
|
37 | } else {
|
38 | return _resolveFilename(request, parent);
|
39 | }
|
40 | };
|
41 |
|
42 | var grunt = require('grunt');
|
43 |
|
44 | Object.keys(grunt.cli.options).forEach(function (key) {
|
45 | var str = grunt.cli.options[key];
|
46 | if (check.unemptyString(str)) {
|
47 | var split = str.split(',');
|
48 | if (split.length > 1) {
|
49 | grunt.cli.options[key] = split;
|
50 | }
|
51 | }
|
52 | });
|
53 |
|
54 | log('grunty options', grunt.cli.options);
|
55 |
|
56 | var plugin = process.argv[2];
|
57 | la(check.unemptyString(plugin),
|
58 | 'missing grunt plugin name to run, for example grunt-contrib-concat',
|
59 | process.argv);
|
60 | log('grunty plugin', plugin);
|
61 |
|
62 | var target = process.argv[3];
|
63 | function isOption(x) {
|
64 | return check.unemptyString(x) && /^-/.test(x);
|
65 | }
|
66 | if (check.unemptyString(target)) {
|
67 | if (isOption(target)) {
|
68 | target = null;
|
69 | }
|
70 | }
|
71 | log('grunty target', target);
|
72 |
|
73 | function isJson(name) {
|
74 | return /\.json$/.test(name);
|
75 | }
|
76 |
|
77 | function isJS(name) {
|
78 | return /\.js$/.test(name);
|
79 | }
|
80 |
|
81 | function isConfigFilename(name) {
|
82 | return check.unemptyString(name) &&
|
83 | fileExists(name) &&
|
84 | (isJson(name) || isJS(name));
|
85 | }
|
86 |
|
87 | var configFile;
|
88 | process.argv.some(function (arg) {
|
89 | if (isConfigFilename(arg)) {
|
90 | configFile = require('path').resolve(arg);
|
91 | return true;
|
92 | }
|
93 | });
|
94 | log('grunty config filename', configFile);
|
95 |
|
96 | var fakeGruntfileFunc = require('../src/fake-gruntfile-code')({
|
97 | plugin: plugin,
|
98 | target: target,
|
99 | config: configFile ? require(configFile) : null,
|
100 | src: grunt.cli.options.src,
|
101 | dest: grunt.cli.options.dest
|
102 | });
|
103 | la(check.fn(fakeGruntfileFunc), 'expected fake gruntfile function', fakeGruntfileFunc);
|
104 | la(fakeGruntfileFunc.length === 1,
|
105 | 'fake gruntfile function should expect 1 argument', fakeGruntfileFunc.toString());
|
106 | require.cache[resolved] = {
|
107 | id: resolved,
|
108 | exports: fakeGruntfileFunc,
|
109 | parent: null,
|
110 | filename: resolved,
|
111 | loaded: true
|
112 | };
|
113 |
|
114 |
|
115 | var _exists = grunt.file.exists;
|
116 | grunt.file.exists = function mockExists(filename) {
|
117 | if (filename === fakeGruntfile) {
|
118 | return true;
|
119 | } else {
|
120 | return _exists(filename)
|
121 | }
|
122 | };
|
123 |
|
124 |
|
125 |
|
126 | function done() {
|
127 | console.log('grunt is done');
|
128 | }
|
129 |
|
130 | var options = {
|
131 | verbose: Boolean(grunt.cli.options.verbose),
|
132 | gruntfile: fakeGruntfile
|
133 | };
|
134 |
|
135 | if (target) {
|
136 | grunt.tasks([target], options, done);
|
137 | }
|
138 |
|
139 |
|