1 | gulp = require 'gulp'
|
2 | gulpif = require 'gulp-if'
|
3 | gutil = require 'gulp-util'
|
4 | browserify = require 'browserify'
|
5 | coffeeify = require 'coffeeify'
|
6 | rename = require 'gulp-rename'
|
7 | uglify = require 'gulp-uglify'
|
8 | stylus = require 'gulp-stylus'
|
9 | concat = require 'gulp-concat'
|
10 | minifyCSS = require 'gulp-minify-css'
|
11 | fs = require 'fs'
|
12 | http = require 'http'
|
13 | argv = require('minimist') process.argv
|
14 | source = require 'vinyl-source-stream'
|
15 | gulpBuffer = require 'gulp-buffer'
|
16 | Promise = require 'bluebird'
|
17 | del = Promise.promisify require 'del'
|
18 | exec = Promise.promisify (require 'child_process').exec
|
19 |
|
20 | ENTRY_PATH = argv.entryPath ? './src/entry.coffee'
|
21 | STYLES_PATH = require './src/themes/styl.includes.coffee'
|
22 | COFFEE_PATH = ['./src/components/**/*.coffee','./src/core/**/*.coffee','./src/init.coffee']
|
23 | LIBS_PATH = ['./libs/*.js']
|
24 | TEST_PATH = ['./test/**/*.test.coffee']
|
25 | LIBS = require './src/lib.includes.coffee'
|
26 |
|
27 |
|
28 |
|
29 | checkParam = (param) -> !(param in ['0', 0, no, 'false', 'no', 'off', '', undefined, null])
|
30 |
|
31 | log = (color, message) ->
|
32 | gutil.log gutil.colors[color] message
|
33 |
|
34 | gulpBrowserify = (options) ->
|
35 | options.extensions or= ['.coffee']
|
36 | options.debug = argv.devMode?
|
37 | b = browserify options
|
38 | b.transform coffeeify
|
39 | b.bundle()
|
40 |
|
41 | watchLogger = (color, watcher) ->
|
42 | livereload = require 'gulp-livereload'
|
43 | server = livereload() if useLiveReload
|
44 | watcher.on 'change', (event) ->
|
45 | log color, "file #{event.path} was #{event.type}"
|
46 | server?.changed event.path
|
47 |
|
48 | createServer = no
|
49 | buildDir = argv.outputDir ? 'build'
|
50 | version = if argv.buildVersion then "#{argv.buildVersion}." else ''
|
51 | useLiveReload = checkParam argv.liveReload
|
52 | useUglify = checkParam argv.uglify
|
53 | useMinify = checkParam argv.minify
|
54 | karmaAction = 'watch'
|
55 | buildDocs = checkParam argv.docs
|
56 | buildPlay = checkParam argv.play
|
57 | theme = checkParam argv.theme
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 | gulp.task 'styles', ['clean'], ->
|
64 |
|
65 | if theme
|
66 | resetStyles = require './src/themes/reset.includes.coffee'
|
67 |
|
68 | themeStyles = []
|
69 | STYLES_PATH = themeStyles.concat resetStyles
|
70 |
|
71 | gulp.src STYLES_PATH
|
72 | .pipe stylus()
|
73 | .pipe concat 'kd.css'
|
74 | .pipe gulpif useMinify, minifyCSS()
|
75 | .pipe rename "kd.#{version}css"
|
76 | .pipe gulp.dest "#{buildDir}/css"
|
77 |
|
78 |
|
79 | gulp.task 'libs', ['clean'], ->
|
80 |
|
81 | gulp.src LIBS
|
82 |
|
83 |
|
84 | .pipe uglify()
|
85 | .pipe concat 'tmp'
|
86 | .pipe rename "kd.libs.#{version}js"
|
87 | .pipe gulp.dest 'test'
|
88 | .pipe gulp.dest "#{buildDir}/js"
|
89 |
|
90 | gulp.task 'export', ->
|
91 |
|
92 | return if argv.entryPath
|
93 |
|
94 | exec "cd ./src;sh exporter.sh > entry.coffee; cd .."
|
95 |
|
96 |
|
97 | gulp.task 'coffee', ['export', 'clean'], ->
|
98 |
|
99 | gulpBrowserify
|
100 | entries : ENTRY_PATH
|
101 | .pipe source ENTRY_PATH
|
102 | .pipe gulpBuffer()
|
103 | .pipe gulpif useUglify, uglify(mangle : no)
|
104 | .pipe rename "kd.#{version}js"
|
105 | .pipe gulp.dest "#{buildDir}/js"
|
106 |
|
107 |
|
108 |
|
109 |
|
110 | gulp.task 'play-styles', ['clean-play'], ->
|
111 |
|
112 | gulp.src ['./playground/main.styl']
|
113 | .pipe stylus()
|
114 | .pipe concat "kd.css"
|
115 | .pipe gulpif useMinify, minifyCSS()
|
116 | .pipe rename "main.css"
|
117 | .pipe gulp.dest "playground/css"
|
118 |
|
119 |
|
120 | gulp.task 'play-html', ->
|
121 |
|
122 | livereload = require 'gulp-livereload'
|
123 | gulp.src './playground/index.html'
|
124 | .pipe gulpif useLiveReload, livereload()
|
125 |
|
126 |
|
127 | gulp.task 'play-coffee', ['clean-play'], ->
|
128 |
|
129 | gulpBrowserify
|
130 | entries : ['./playground/main.coffee']
|
131 | .pipe source "main.js"
|
132 | .pipe gulp.dest "playground/js"
|
133 |
|
134 |
|
135 | gulp.task 'play', ['clean-play', 'play-html', 'play-styles', 'play-coffee'], ->
|
136 |
|
137 |
|
138 |
|
139 |
|
140 | gulp.task 'docs-exec', ->
|
141 | exec "cd docs;mkdir js;mkdir css;cd .."
|
142 |
|
143 |
|
144 | gulp.task 'docs-coffee', ['docs-exec'], ->
|
145 |
|
146 | gulpBrowserify
|
147 | entries : ['./docs/src/main.coffee']
|
148 | .pipe source 'main.js'
|
149 | .pipe gulp.dest 'docs/js'
|
150 |
|
151 |
|
152 | gulp.task 'docs-styles', ['docs-exec'],->
|
153 |
|
154 | gulp.src ['./docs/src/styl/main.styl']
|
155 | .pipe stylus()
|
156 | .pipe gulpif useMinify, minifyCSS()
|
157 | .pipe rename 'main.css'
|
158 | .pipe gulp.dest 'docs/css'
|
159 |
|
160 |
|
161 | gulp.task 'docs-html', ->
|
162 |
|
163 | livereload = require 'gulp-livereload'
|
164 | gulp.src './docs/index.html'
|
165 | .pipe gulpif useLiveReload, livereload()
|
166 |
|
167 |
|
168 |
|
169 |
|
170 |
|
171 |
|
172 |
|
173 |
|
174 |
|
175 |
|
176 |
|
177 |
|
178 |
|
179 |
|
180 |
|
181 |
|
182 |
|
183 |
|
184 |
|
185 |
|
186 | gulp.task 'docs-sitemap', ->
|
187 |
|
188 | find = require 'findit'
|
189 | folder = "#{__dirname}/docs/contents/"
|
190 | finder = find folder
|
191 | tree = {}
|
192 | trimBase = (dir) -> dir.replace folder, ''
|
193 |
|
194 | finder.on 'directory', (dir, stat, stop) ->
|
195 | dir = trimBase dir
|
196 | return if /\//.test dir
|
197 | tree[dir] = [] if dir
|
198 |
|
199 | finder.on 'file', (file, stat) ->
|
200 | file = trimBase file
|
201 | return unless /\//.test file
|
202 | [parent, file] = file.split '/'
|
203 | tree[parent].push file if file
|
204 |
|
205 | finder.on 'end', ->
|
206 | content = "(function(){window.KD||(window.KD={});KD.sitemap=#{JSON.stringify tree}})()"
|
207 | fs.writeFileSync "#{__dirname}/docs/js/kd.sitemap.js", content
|
208 |
|
209 |
|
210 | gulp.task 'docs', ['docs-exec', 'docs-html', 'docs-sitemap',
|
211 | 'docs-coffee', 'docs-styles']
|
212 |
|
213 |
|
214 |
|
215 |
|
216 | gulp.task 'coffee-test', ->
|
217 |
|
218 | stream = gulpBrowserify
|
219 | entries : './test/test.coffee'
|
220 | .pipe source "kd.test.js"
|
221 | .pipe gulp.dest 'test'
|
222 |
|
223 |
|
224 | testFiles = [
|
225 | './test/kd.libs.js'
|
226 | './test/kd.test.js'
|
227 | ]
|
228 |
|
229 | gulp.task 'karma', ['coffee-test'], ->
|
230 |
|
231 | karma = require 'gulp-karma'
|
232 |
|
233 | gulp.src testFiles
|
234 | .pipe karma
|
235 | configFile : 'karma.conf.js'
|
236 | action : karmaAction
|
237 |
|
238 |
|
239 | gulp.task 'karma-travis', ['coffee-test'], ->
|
240 | karma = require 'gulp-karma'
|
241 | gulp.src testFiles
|
242 | .pipe karma
|
243 | configFile : 'karma.travis.conf.js'
|
244 | action : 'run'
|
245 |
|
246 |
|
247 | gulp.task 'sauce', ->
|
248 | gulp.src testFiles
|
249 | .pipe karma
|
250 | browsers : [
|
251 | 'sl_firefox_windows'
|
252 | 'sl_chrome_windows'
|
253 | 'sl_ie_9'
|
254 | 'sl_ie_10'
|
255 | ]
|
256 | configFile : 'karma.conf.js'
|
257 | action : 'run'
|
258 |
|
259 |
|
260 |
|
261 |
|
262 | gulp.task 'webserver', ['compile'], ->
|
263 | express = require 'express'
|
264 | app = express()
|
265 |
|
266 | app.use express.static "#{__dirname}/#{buildDir}"
|
267 |
|
268 | app.get '*', (req, res) ->
|
269 | {url} = req
|
270 | redirectTo = "/#!#{url}"
|
271 |
|
272 | res.header 'Location', redirectTo
|
273 | res.send 301
|
274 |
|
275 | app.listen 3000
|
276 |
|
277 | log 'green', "HTTP server for #{buildDir} is ready at localhost:3000"
|
278 | return
|
279 |
|
280 |
|
281 |
|
282 |
|
283 | gulp.task 'watch-test', ->
|
284 |
|
285 | watchLogger 'cyan', gulp.watch TEST_PATH, ['coffee-test']
|
286 |
|
287 |
|
288 | gulp.task 'watch-coffee', ->
|
289 |
|
290 | watchLogger 'yellow', gulp.watch COFFEE_PATH, ['coffee']
|
291 |
|
292 |
|
293 | gulp.task 'watch-libs', ->
|
294 |
|
295 | watchLogger 'yellow', gulp.watch LIBS_PATH, ['libs']
|
296 |
|
297 |
|
298 | gulp.task 'watch-styles', ->
|
299 |
|
300 | watchLogger 'yellow', gulp.watch STYLES_PATH, ['styles']
|
301 |
|
302 |
|
303 | gulp.task 'watch-playground', ->
|
304 |
|
305 | watchLogger 'blue', gulp.watch [
|
306 | './playground/**/*.coffee'
|
307 | './playground/**/*.styl'
|
308 | './playground/**/*.html'
|
309 | ], ['play']
|
310 |
|
311 |
|
312 | gulp.task 'watch-docs', ->
|
313 |
|
314 | watchLogger 'blue', gulp.watch [
|
315 | './docs/src/**/*.coffee'
|
316 | './docs/src/**/*.styl'
|
317 | './docs/*.html'
|
318 | ], ['docs']
|
319 |
|
320 |
|
321 |
|
322 |
|
323 | gulp.task 'live', -> useLiveReload = yes
|
324 |
|
325 |
|
326 | gulp.task 'run', -> karmaAction = 'run'
|
327 |
|
328 |
|
329 | gulp.task 'clean', -> del ['build'], force : yes
|
330 |
|
331 |
|
332 | gulp.task 'clean-play', -> del ['./playground/{css,js}'], force : yes
|
333 |
|
334 |
|
335 |
|
336 |
|
337 | gulp.task 'markdox', ->
|
338 |
|
339 | markdox = require 'gulp-markdox'
|
340 |
|
341 | gulp.src [
|
342 | 'src/**/core/**/*.coffee'
|
343 | 'src/**/components/**/*.coffee'
|
344 | ]
|
345 | .pipe markdox()
|
346 | .pipe rename extname: '.md'
|
347 | .pipe gulp.dest 'docs/api'
|
348 |
|
349 |
|
350 |
|
351 |
|
352 | gulp.task 'compile', ['styles', 'libs', 'coffee']
|
353 |
|
354 | defaultTasks = ['compile', 'watch-styles', 'watch-coffee', 'watch-libs']
|
355 |
|
356 | if buildDocs
|
357 | buildDir = 'docs'
|
358 | defaultTasks = defaultTasks.concat ['live', 'docs', 'watch-docs', 'webserver']
|
359 | else if buildPlay
|
360 | buildDir = 'playground'
|
361 | defaultTasks = defaultTasks.concat ['live', 'play', 'watch-playground', 'webserver']
|
362 |
|
363 |
|
364 | gulp.task 'default', defaultTasks , -> log 'green', 'All done!'
|
365 |
|
366 |
|
367 |
|
368 |
|
369 | process.on 'uncaughtException', (err)->
|
370 |
|
371 | log 'red', "An error has occurred: #{err.name}"
|
372 | console.error err
|