UNPKG

4.84 kBJavaScriptView Raw
1import path from "path";
2import runSequence from "run-sequence";
3import path from "path";
4import fs from "fs";
5import compileParams from "./utils/compileParams";
6import merge from "deepmerge";
7import callsite from "callsite";
8import colors from 'colors';
9import Notification from './utils/notification';
10import {pwd} from 'shelljs';
11import assign from 'object-assign';
12
13var tasks = {};
14var queue = {};
15var settings = {vars: {src: './src', dist: './dist'}};
16
17export 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}