79 lines
2.3 KiB
CoffeeScript
79 lines
2.3 KiB
CoffeeScript
# Building Chosen requires coffee-script and uglify-js. For
|
|
# help installing, try:
|
|
#
|
|
# `npm -g install coffee-script uglify-js`
|
|
#
|
|
fs = require 'fs'
|
|
path = require 'path'
|
|
{spawn, exec} = require 'child_process'
|
|
CoffeeScript = require 'coffee-script'
|
|
{parser, uglify} = require 'uglify-js'
|
|
|
|
javascripts = {
|
|
'chosen/chosen.jquery.js': [
|
|
'coffee/chosen/select-parser.coffee'
|
|
'coffee/chosen.jquery.coffee'
|
|
]
|
|
'chosen/chosen.proto.js': [
|
|
'coffee/chosen/select-parser.coffee'
|
|
'coffee/chosen.proto.coffee'
|
|
]
|
|
}
|
|
|
|
Array::unique = ->
|
|
output = {}
|
|
output[@[key]] = @[key] for key in [0...@length]
|
|
value for key, value of output
|
|
|
|
# Gather a list of unique source files.
|
|
#
|
|
source_files = ->
|
|
all_sources = []
|
|
for javascript, sources of javascripts
|
|
for source in sources
|
|
all_sources.push source
|
|
all_sources.unique()
|
|
|
|
# Get the version number
|
|
#
|
|
version = ->
|
|
"#{fs.readFileSync('VERSION')}".replace /[^0-9a-zA-Z.]*/gm, ''
|
|
|
|
# Write chosen files with a header
|
|
#
|
|
write_chosen_javascript = (filename, body) ->
|
|
fs.writeFileSync filename, """
|
|
// Chosen #{version()} https://github.com/harvesthq/chosen
|
|
// Copyright (c) 2011 Harvest http://getharvest.com
|
|
// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
|
|
// This file is generated by `cake build`, do not edit it by hand.
|
|
#{body}
|
|
"""
|
|
|
|
# Build Chosen.
|
|
#
|
|
task 'build', 'build Chosen from source', build = (cb) ->
|
|
for javascript, sources of javascripts
|
|
code = ''
|
|
for source in sources
|
|
code += CoffeeScript.compile "#{fs.readFileSync source}"
|
|
write_chosen_javascript javascript, code
|
|
unless process.env.MINIFY is 'false'
|
|
write_chosen_javascript javascript.replace(/\.js$/,'.min.js'), (
|
|
uglify.gen_code uglify.ast_squeeze uglify.ast_mangle parser.parse code
|
|
)
|
|
cb() if typeof cb is 'function'
|
|
|
|
task 'watch', 'watch coffee/ for changes and build Chosen', ->
|
|
console.log "Watching for changes in coffee/"
|
|
for file in source_files()
|
|
# Coffeescript wasn't scoping file correctly-
|
|
# without this closure the file name displayed
|
|
# is incorrect.
|
|
((file) ->
|
|
fs.watchFile file, (curr, prev) ->
|
|
if +curr.mtime isnt +prev.mtime
|
|
console.log "Saw change in #{file}"
|
|
invoke 'build'
|
|
)(file)
|