1 | import path from "path";
|
2 | import runSequence from "run-sequence";
|
3 | import path from "path";
|
4 | import fs from "fs";
|
5 | import compileParams from "./utils/compileParams";
|
6 | import merge from "deepmerge";
|
7 | import callsite from "callsite";
|
8 | import colors from 'colors';
|
9 | import Notification from './utils/notification';
|
10 | import {pwd} from 'shelljs';
|
11 | import assign from 'object-assign';
|
12 |
|
13 | var tasks = {};
|
14 | var queue = {};
|
15 | var settings = {vars: {src: './src', dist: './dist'}};
|
16 |
|
17 | export default class Pruno {
|
18 | constructor(cb) {
|
19 | try {
|
20 | var parent = module.parent;
|
21 | var gulp = parent.require('gulp');
|
22 | }
|
23 | catch (err) {
|
24 | throw new Error('Gulp is not currently installed. Please run `npm install -D gulp`.');
|
25 | }
|
26 |
|
27 | var stack = callsite();
|
28 | settings.topLevel = path.dirname(stack[1].getFileName());
|
29 |
|
30 | if (! gulp) {
|
31 | throw new ReferenceError(
|
32 | 'Please define the instance of gulp for pruno to use by executing ' +
|
33 | 'pruno.use(gulp) before executing pruno\'s constructor'
|
34 | );
|
35 | }
|
36 |
|
37 | require('./modules/configure');
|
38 |
|
39 | var defaults = [];
|
40 | var gulpWatchers = [];
|
41 | var watchers = [];
|
42 |
|
43 | cb(tasks);
|
44 |
|
45 | Object.keys(queue).forEach((taskName) => {
|
46 | var task = queue[taskName].instance;
|
47 | if (typeof task.enqueue === 'function' && defaults.indexOf(taskName) === -1) {
|
48 | gulp.task(taskName, task.enqueue.bind(null, gulp, task.params));
|
49 | defaults.push(taskName);
|
50 | }
|
51 |
|
52 | var watchName = `${taskName}:watch`;
|
53 | var watcher = task.generateWatcher ?
|
54 | task.generateWatcher(gulp, task.params) :
|
55 | false;
|
56 |
|
57 | if (watchers.indexOf(watchName) === -1) {
|
58 | if (typeof watcher === 'function') {
|
59 | gulp.task(watchName, watcher);
|
60 | watchers.push(watchName);
|
61 | }
|
62 | else if (watcher === true) {
|
63 | var {search} = task.params;
|
64 | gulp.task(watchName, task.enqueue.bind(null, gulp, task.params));
|
65 | gulpWatchers.push({search, watchName});
|
66 | }
|
67 | }
|
68 | });
|
69 |
|
70 | runSequence = runSequence.use(gulp);
|
71 |
|
72 | gulp.task('default', function() {
|
73 | var tasks = defaults.map(task => task.underline.yellow).join(', ');
|
74 | Pruno.notify('Starting', tasks);
|
75 |
|
76 | runSequence(defaults);
|
77 | });
|
78 |
|
79 | if (watchers.length + gulpWatchers.length > 0) {
|
80 | gulp.task('watch', function() {
|
81 | if (watchers.length > 0) {
|
82 | runSequence(watchers);
|
83 | }
|
84 |
|
85 | gulpWatchers.forEach(watcher => {
|
86 | runSequence(watcher.watchName);
|
87 | gulp.watch(watcher.search, [watcher.watchName]);
|
88 | });
|
89 | });
|
90 | }
|
91 | }
|
92 |
|
93 | static plugins(cb) {
|
94 | var {dependencies, devDependencies} = module.parent.require(
|
95 | path.join(pwd(), 'package.json')
|
96 | );
|
97 |
|
98 | var modules = Object.keys(assign(
|
99 | {},
|
100 | (dependencies || {}),
|
101 | (devDependencies || {}))
|
102 | ).filter(mod => /^pruno\-(.+)/.exec(mod)).forEach(mod => {
|
103 | var mix = module.parent.require(mod);
|
104 | });
|
105 |
|
106 | return Pruno;
|
107 | }
|
108 |
|
109 | static extend(task) {
|
110 | var displayName = (task.displayName || task.name).toLowerCase()
|
111 | .replace(/Task$/i, '');
|
112 |
|
113 | var taskName, instance;
|
114 | tasks[displayName] = (name = null, params = {}) => {
|
115 | if (typeof name === 'object') {
|
116 | params = name;
|
117 | taskName = displayName;
|
118 | }
|
119 | else {
|
120 | taskName = `${displayName}-${name}`;
|
121 | }
|
122 |
|
123 | var defaults = typeof task.getDefaults === 'function' ?
|
124 | task.getDefaults() : {};
|
125 |
|
126 | var baseSettings = settings[displayName] || {};
|
127 |
|
128 | var opts = compileParams(taskName, defaults, baseSettings, params, settings);
|
129 | opts.taskName = taskName;
|
130 |
|
131 | instance = new task(opts);
|
132 | queue[taskName] = {instance, opts};
|
133 |
|
134 | return tasks;
|
135 | }
|
136 | }
|
137 |
|
138 | static use(gulp) {
|
139 | throw new Error(
|
140 | 'pruno.use(...) has been deprecated. The parent modules gulp instance ' +
|
141 | 'is now automatically inferred.'
|
142 | );
|
143 | }
|
144 |
|
145 | static setDefaults(opts = {}) {
|
146 | settings = merge(settings, opts);
|
147 | }
|
148 |
|
149 | static notify(plugin, ...parts) {
|
150 | var timestamp = new Date();
|
151 | var stamp = `[pruno - ${timestamp}]`;
|
152 | var pluginLabel = `[${plugin}]`;
|
153 |
|
154 | parts = Array.isArray(parts) ? parts : [parts];
|
155 |
|
156 | console.log.apply(console, [
|
157 | stamp.bold.green,
|
158 | pluginLabel.bold.magenta
|
159 | ].concat(parts));
|
160 |
|
161 | new Notification().message(parts.join(' '));
|
162 | }
|
163 |
|
164 | static error(plugin, ...parts) {
|
165 | var timestamp = new Date();
|
166 | var stamp = `[pruno - ${timestamp}]`;
|
167 | var pluginLabel = `[${plugin}]`;
|
168 |
|
169 | parts = Array.isArray(parts) ? parts : [parts];
|
170 |
|
171 | console.error.apply(console, [
|
172 | stamp.bold.red,
|
173 | pluginLabel.bold.magenta
|
174 | ].concat(parts));
|
175 |
|
176 | new Notification().error(parts.join(' '));
|
177 | }
|
178 |
|
179 | static get(property) {
|
180 | if (! property) {
|
181 | throw new TypeError('You must define a property go get.');
|
182 | }
|
183 |
|
184 | return settings[property];
|
185 | }
|
186 | }
|