UNPKG

8.57 kBtext/coffeescriptView Raw
1gulp = require 'gulp'
2gulpif = require 'gulp-if'
3gutil = require 'gulp-util'
4browserify = require 'browserify'
5coffeeify = require 'coffeeify'
6rename = require 'gulp-rename'
7uglify = require 'gulp-uglify'
8stylus = require 'gulp-stylus'
9concat = require 'gulp-concat'
10minifyCSS = require 'gulp-minify-css'
11fs = require 'fs'
12http = require 'http'
13argv = require('minimist') process.argv
14source = require 'vinyl-source-stream'
15gulpBuffer = require 'gulp-buffer'
16Promise = require 'bluebird'
17del = Promise.promisify require 'del'
18exec = Promise.promisify (require 'child_process').exec
19
20ENTRY_PATH = argv.entryPath ? './src/entry.coffee'
21STYLES_PATH = require './src/themes/styl.includes.coffee'
22COFFEE_PATH = ['./src/components/**/*.coffee','./src/core/**/*.coffee','./src/init.coffee']
23LIBS_PATH = ['./libs/*.js']
24TEST_PATH = ['./test/**/*.test.coffee']
25LIBS = require './src/lib.includes.coffee'
26
27# Helpers
28
29checkParam = (param) -> !(param in ['0', 0, no, 'false', 'no', 'off', '', undefined, null])
30
31log = (color, message) ->
32 gutil.log gutil.colors[color] message
33
34gulpBrowserify = (options) ->
35 options.extensions or= ['.coffee']
36 options.debug = argv.devMode?
37 b = browserify options
38 b.transform coffeeify
39 b.bundle()
40
41watchLogger = (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
48createServer = no
49buildDir = argv.outputDir ? 'build'
50version = if argv.buildVersion then "#{argv.buildVersion}." else ''
51useLiveReload = checkParam argv.liveReload
52useUglify = checkParam argv.uglify
53useMinify = checkParam argv.minify
54karmaAction = 'watch'
55buildDocs = checkParam argv.docs
56buildPlay = checkParam argv.play
57theme = checkParam argv.theme
58
59
60# Build Tasks
61
62
63gulp.task 'styles', ['clean'], ->
64
65 if theme
66 resetStyles = require './src/themes/reset.includes.coffee'
67 # FIXME: require & put real theme styl files array here
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
79gulp.task 'libs', ['clean'], ->
80
81 gulp.src LIBS
82 # INVESTIGATE: this somehow breaks jQuery - SY
83 # .pipe gulpif useUglify, uglify()
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
90gulp.task 'export', ->
91
92 return if argv.entryPath
93
94 exec "cd ./src;sh exporter.sh > entry.coffee; cd .."
95
96
97gulp.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# Build Playground
109
110gulp.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
120gulp.task 'play-html', ->
121
122 livereload = require 'gulp-livereload'
123 gulp.src './playground/index.html'
124 .pipe gulpif useLiveReload, livereload()
125
126
127gulp.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
135gulp.task 'play', ['clean-play', 'play-html', 'play-styles', 'play-coffee'], ->
136
137
138# Build docs
139
140gulp.task 'docs-exec', ->
141 exec "cd docs;mkdir js;mkdir css;cd .."
142
143
144gulp.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
152gulp.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
161gulp.task 'docs-html', ->
162
163 livereload = require 'gulp-livereload'
164 gulp.src './docs/index.html'
165 .pipe gulpif useLiveReload, livereload()
166
167
168# sitemap task
169
170# this creates a simple two level sitemap
171# for the files under ./docs/contents
172#
173# e.g.
174# ./docs/contents/getting.started/readme.md
175# ./docs/contents/getting.started/sample.md
176# ./docs/contents/more.examples/readme.md
177# ./docs/contents/more.examples/sample.md
178#
179# becomes
180#
181# KD.sitemap = {
182# 'getting.started' : ['readme.md', 'sample.md']
183# 'more.examples' : ['readme.md', 'sample.md']
184# }
185
186gulp.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
210gulp.task 'docs', ['docs-exec', 'docs-html', 'docs-sitemap',
211 'docs-coffee', 'docs-styles']
212
213
214# Build test suite
215
216gulp.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
224testFiles = [
225 './test/kd.libs.js'
226 './test/kd.test.js'
227]
228
229gulp.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
239gulp.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
247gulp.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# build webserver
261
262gulp.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# Watch Tasks
282
283gulp.task 'watch-test', ->
284
285 watchLogger 'cyan', gulp.watch TEST_PATH, ['coffee-test']
286
287
288gulp.task 'watch-coffee', ->
289
290 watchLogger 'yellow', gulp.watch COFFEE_PATH, ['coffee']
291
292
293gulp.task 'watch-libs', ->
294
295 watchLogger 'yellow', gulp.watch LIBS_PATH, ['libs']
296
297
298gulp.task 'watch-styles', ->
299
300 watchLogger 'yellow', gulp.watch STYLES_PATH, ['styles']
301
302
303gulp.task 'watch-playground', ->
304
305 watchLogger 'blue', gulp.watch [
306 './playground/**/*.coffee'
307 './playground/**/*.styl'
308 './playground/**/*.html'
309 ], ['play']
310
311
312gulp.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# Helper Tasks
322
323gulp.task 'live', -> useLiveReload = yes
324
325
326gulp.task 'run', -> karmaAction = 'run'
327
328
329gulp.task 'clean', -> del ['build'], force : yes
330
331
332gulp.task 'clean-play', -> del ['./playground/{css,js}'], force : yes
333
334
335
336# Use markdox to output markdown files for the API Documentation.
337gulp.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# Aggregate Tasks
351
352gulp.task 'compile', ['styles', 'libs', 'coffee']
353
354defaultTasks = ['compile', 'watch-styles', 'watch-coffee', 'watch-libs']
355
356if buildDocs
357 buildDir = 'docs'
358 defaultTasks = defaultTasks.concat ['live', 'docs', 'watch-docs', 'webserver']
359else if buildPlay
360 buildDir = 'playground'
361 defaultTasks = defaultTasks.concat ['live', 'play', 'watch-playground', 'webserver']
362
363
364gulp.task 'default', defaultTasks , -> log 'green', 'All done!'
365
366
367# error handling
368
369process.on 'uncaughtException', (err)->
370
371 log 'red', "An error has occurred: #{err.name}"
372 console.error err