UNPKG

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