-
Notifications
You must be signed in to change notification settings - Fork 0
/
gulpfile.js
185 lines (102 loc) · 3.68 KB
/
gulpfile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
'use strict'
// Require
const fs = require( 'fs' )
const path = require( 'path' )
const pipe = require( './core/pipe' )
const { series, parallel, watch, src, dest, lastRun } = require( 'gulp' )
const { notify, config, paths } = require( './core' )
const { isFile } = require( './core/is' )
// Environment
const isDevelopment = !process.env.NODE_ENV || process.env.NODE_ENV == 'development'
// Gulp
const gulp = {} // for gulp api
const build = [] // for build task
const watchers = [] // for watchers
// Store
const store = {}
// Error handler
const plumber = require( 'gulp-plumber' )
const errorHandler = (err) => {
return plumber( err => {
console.log( err )
return notify.onError( 'Error' )( err )
})
}
// Try add tasks
try {
fs.readdirSync( paths._tasks ).forEach( item => {
if ( path.extname( item ) !== '.js' ) return
const file = path.join( paths._tasks, item )
const task = require( file )
const name = task.name || path.basename( item, '.js' )
// Task already exist
if ( gulp[name] )
return console.log( `The task [${name}] already exist!` )
// No run func
if ( typeof task.run !== 'function' )
return console.log( `The task [${name}] must contain run function!` )
// Add some to all tasks
task.mainBundle = config.build.mainBundle
task.isDev = isDevelopment // env
task.notify = notify // notify api
task.plumber = errorHandler // error handler
task.config = config // app config
task.store = store // store
task.paths = paths // paths list
task.path = path // node path api
task.fs = fs // node fs api
task.pipe = pipe // pipe
task.isFile = isFile // isFile
// Add gulp api to tasks
task.gulp = { series, parallel, src, dest, lastRun }
// Plugged into the task system
gulp[name] = task.run.bind( task )
gulp[name].displayName = name
// Add watcher
if ( isDevelopment && typeof task.watch === 'function' ) {
let watcher = task.watch()
watcher = Array.isArray( watcher ) ? watcher : [watcher]
watchers.push( ...watcher )
}
// Add to main build
if ( typeof task.build === 'number' ) {
if ( ! build[task.build] ) build[task.build] = []
build[task.build].push( gulp[name] )
}
})
} catch (e) { console.log(e) }
// Build task
if ( build.length > 0 ) {
const run = []
build.forEach( level => {
if ( !Array.isArray( level ) ) return
const tasks = level.filter( item => typeof item === 'function' )
if ( tasks.length === 0 ) return
run.push( parallel(...tasks) )
})
gulp.default = series(...run)
}
// Watch on develop
if ( process.env.WATCH ) watchers.forEach( item => {
if ( !item || item.constructor !== Object )
return console.log( `Watcher must be a object!` )
const files = paths.slashNormalize( item.files )
const tasks = Array.isArray( item.tasks ) ? item.tasks : [item.tasks]
const options = Object.assign({}, item.options )
const run = []
if ( ! files ) return console.log( `Watcher must contain a globs for watch on the file system!` )
tasks.forEach( item => {
if ( typeof item === 'function' ) return run.push( item )
if ( typeof item === 'string' && gulp[item] ) return run.push( gulp[item] )
})
const watcher = ( run.length === 0 ) ? watch( files, options ) : watch( files, options, series(...run) )
if ( item.on && item.on.constructor === Object ) {
if ( typeof item.on.event !== 'string' )
return console.log( `Watcher event name must be a string!` )
if ( typeof item.on.handler !== 'function' )
return console.log( `Watcher event handler must be a function!` )
watcher.on( item.on.event, item.on.handler )
}
})
// Export
module.exports = gulp