-
Notifications
You must be signed in to change notification settings - Fork 26
/
gulpfile.ls
326 lines (270 loc) · 9.51 KB
/
gulpfile.ls
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
require! 'yargs':{argv}
if argv.webapp
webapp = that
else
console.log "ERROR: You should pass a --webapp=mywebapp parameter. Exiting."
process.exit!
webapp = argv.webapp
only-compile = yes if argv.optimize is true
console.log "------------------------------------------"
#console.log "App\t: #{app}"
console.log "Webapp\t: #{webapp}"
if only-compile
console.log "------------------------------------------"
console.log " Gulp is running only once for optimization..."
console.log "------------------------------------------"
require! <[ watchify gulp browserify glob path fs globby touch ]>
require! 'prelude-ls': {union, join, keys, map, unique}
require! 'vinyl-source-stream': source
require! 'vinyl-buffer': buffer
require! 'gulp-watch': watch
require! 'gulp-pug': pug
require! './templates/filters': {pug-filters}
require! 'node-notifier': notifier
require! 'gulp-concat': cat
require! 'gulp-uglify': uglify
require! './src/lib/aea': {sleep, pack}
require! './src/lib/aea/ractive-preparserify': {
ractive-preparserify
preparserify-dep-list
}
require! './src/lib/aea/browserify-optimize-js'
require! 'gulp-flatten': flatten
require! 'gulp-tap': tap
require! 'gulp-cached': cache
require! 'gulp-sourcemaps': sourcemaps
require! 'browserify-livescript'
require! 'run-sequence'
require! 'through2':through
require! 'optimize-js'
require! 'gulp-if-else': if-else
require! 'gulp-rename': rename
# Build Settings
notification-enabled = yes
# Project Folder Structure
paths =
vendor-folder: "#{__dirname}/vendor"
build-folder: "#{__dirname}/build"
lib-src: "#{__dirname}/src/lib"
client-webapps: "#{__dirname}/../webapps"
client-root: "#{__dirname}/.."
paths.client-public = "#{paths.build-folder}/#{webapp}"
paths.components-src = "#{__dirname}/components"
notifier.notify {title: "ScadaJS" message: "Webapp \"#{webapp}\" started!"}
on-error = (source, msg) ->
msg = try
msg.to-string!
catch
"unknown message: #{e}"
console-msg = "GULP ERROR: #{source} : #{msg}"
notifier.notify {title: console-msg, message: msg} if notification-enabled
console.log console-msg
log-info = (source, msg) ->
msg = try
msg.to-string!
catch
"unknown message: #{e}"
console-msg = "GULP INFO: #{source} : #{msg}"
notifier.notify {title: "GULP.#{source}", message: msg} if notification-enabled
console.log console-msg
pug-entry-files = glob.sync "#{paths.client-webapps}/#{webapp}/index.pug"
html-entry-files = glob.sync "#{paths.client-webapps}/#{webapp}/index.html"
ls-entry-files = glob.sync "#{paths.client-webapps}/#{webapp}/app.{ls,js}"
for-css =
"#{paths.vendor-folder}/**/*.css"
"!#{paths.vendor-folder}/**/__tmp__/**"
"#{paths.components-src}/**/*.css"
"#{paths.client-webapps}/**/*.css"
for-js =
"#{paths.vendor-folder}/**/*.js"
"!#{paths.vendor-folder}/**/__tmp__/**"
"!#{paths.vendor-folder}/**/assets/**"
# changes on these files will invalidate browserify cache
for-preparserify-workaround =
"#{paths.client-webapps}/#{webapp}/**/*.pug"
"#{paths.client-webapps}/#{webapp}/**/*.html"
"#{paths.components-src}/**/*.pug"
"#{paths.components-src}/**/*.html"
for-assets =
"#{paths.components-src}/**/assets/**"
"#{paths.client-root}/assets/**"
"#{paths.client-webapps}/**/assets/**"
"#{__dirname}/assets/**"
# assets folder in vendor
"#{paths.vendor-folder}/**/assets/**"
"!#{paths.vendor-folder}/**/__tmp__/**"
"!#{paths.vendor-folder}/**/tmp-*/**"
for-browserify =
# livescript files in webapp folder
"#{paths.client-webapps}/#{webapp}/**/*.ls"
# files in components
"#{paths.components-src}/**/*.ls"
"#{paths.components-src}/**/*.js"
# files in lib
"#{paths.lib-src}/**/*.ls"
"#{paths.lib-src}/**/*.js"
# Organize Tasks
gulp.task \default, ->
if argv.clean is true
console.log "Clearing build directory..."
deleteFolderRecursive paths.build-folder
return
do function run-all
gulp.start do
\browserify
\html
\vendor-js
\vendor-css
\assets
\pug
\preparserify-workaround
if only-compile
return
watch pug-entry-files, ->
gulp.start \pug
watch html-entry-files, ->
gulp.start \html
watch for-css, (event) ->
gulp.start <[ vendor-css ]>
watch for-js, (event) ->
gulp.start <[ vendor-js ]>
watch for-browserify, ->
gulp.start \browserify
watch for-preparserify-workaround, ->
gulp.start \preparserify-workaround
watch for-assets, ->
gulp.start \assets
# Copy js and html files as is
#gulp.task \copy-js, ->
# gulp.src "#{paths.client-src}/**/*.js", {base: paths.client-src}
# .pipe gulp.dest paths.client-public
gulp.task \html, ->
gulp.src html-entry-files
#.pipe rename basename: app
.pipe flatten!
.pipe gulp.dest paths.client-public
my-uglify = (x) ->
uglify {mangle: except: ['$super']}, x
browserify-cache = {}
bundler = browserify do
entries: ls-entry-files
debug: true
paths:
paths.components-src
paths.lib-src
paths.client-webapps
"#{__dirname}/node_modules"
extensions: <[ .ls ]>
cache: browserify-cache
package-cache: {}
plugin:
watchify unless only-compile
...
bundler.transform browserify-livescript
bundler.transform ractive-preparserify
bundler.transform browserify-optimize-js
first-browserify-done = no
function bundle
bundler
.bundle!
.on \error, (err) ->
msg = try
err.message
catch
err
on-error \browserify, msg
@emit \end
.pipe source "#{webapp}/app.js"
.pipe buffer!
#.pipe sourcemaps.init {+load-maps, +large-files}
.pipe if-else only-compile, my-uglify
#.pipe rename basename: 'app'
#.pipe sourcemaps.write '.'
.pipe gulp.dest paths.build-folder
.pipe tap (file) ->
log-info \browserify, "Browserify finished (#{webapp})"
#console.log "browserify cache: ", pack keys browserify-cache
console.log "------------------------------------------"
first-browserify-done := yes
gulp.task \browserify, ->
bundle!
# Concatenate vendor javascript files into public/js/vendor.js
gulp.task \vendor-js, ->
gulp.src for-js
.pipe cat "vendor.js"
.pipe if-else only-compile, my-uglify
.pipe through.obj (file, enc, cb) ->
contents = file.contents.to-string!
optimized = optimize-js contents
optimized = "//optimized by optimize.js\n" + optimized
file.contents = new Buffer optimized
cb null, file
.pipe gulp.dest "#{paths.client-public}/js"
# Concatenate vendor css files into public/css/vendor.css
gulp.task \vendor-css, ->
gulp.src for-css
.pipe cat "vendor.css"
.pipe gulp.dest "#{paths.client-public}/css"
# Copy assets into the public directory as is
# search for a folder named "assets", copy and paste its contents into
# build folder.
gulp.task \assets, ->
gulp.src for-assets
.pipe rename (path) ->
path-parts = path.dirname.split('/')
parts = []
found-assets = no
for i in path-parts
if i isnt \assets
unless found-assets
continue
else
if not found-assets
found-assets = yes
continue
parts.push i
_tmp = join '/', parts
path.dirname = _tmp if found-assets
.pipe gulp.dest paths.client-public
# Compile pug files in paths.client-src to the paths.client-tmp folder
gulp.task \pug ->
gulp.src pug-entry-files
.pipe tap (file) ->
#console.log "pug: compiling file: ", path.basename file.path
.pipe pug do
pretty: yes
locals:
app: 'ScadaJS'
filters: pug-filters
.on \error, (err) ->
on-error \pug, err
@emit \end
#.pipe rename basename: app
.pipe flatten!
.pipe gulp.dest paths.client-public
# FIXME: This is a workaround before ractive-preparserify
# will handle this process all by itself.
debounce = {}
gulp.task \preparserify-workaround ->
gulp.src for-preparserify-workaround
.pipe cache 'preparserify-workaround-cache'
.pipe tap (file) ->
#console.log "preparserify-workaround: invalidating: ", file.path
unless first-browserify-done
#console.log "DEBUG: Ractive Preparserify: skipping because first browserify is not done yet"
return
rel = preparserify-dep-list[file.path]
if typeof! rel is \Array
for js-file in unique rel
console.log "INFO: Preparserify workaround: triggering for #{path.basename js-file}"
try
clear-timeout debounce[js-file]
console.log "Preventing debounce for #{js-file}"
catch
console.log "...no need to prevent debounce for #{js-file}"
debounce[js-file] = sleep 100ms, ->
touch.sync js-file
delete debounce[js-file]
else
log-info 'preparserify', "related documents should be an array: "
console.log pack rel