177 lines
5.2 KiB
CoffeeScript
177 lines
5.2 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/lib/select-parser.coffee'
|
|
'coffee/lib/abstract-chosen.coffee'
|
|
'coffee/chosen.jquery.coffee'
|
|
]
|
|
'chosen/chosen.proto.js': [
|
|
'coffee/lib/select-parser.coffee'
|
|
'coffee/lib/abstract-chosen.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, ''
|
|
|
|
version_tag = ->
|
|
"v#{version()}"
|
|
|
|
# Write chosen files with a header
|
|
#
|
|
write_chosen_javascript = (filename, body) ->
|
|
fs.writeFileSync filename, """
|
|
// Chosen, a Select Box Enhancer for jQuery and Protoype
|
|
// by Patrick Filler for Harvest, http://getharvest.com
|
|
//
|
|
// Version #{version()}
|
|
// Full source at 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}
|
|
"""
|
|
console.log "Wrote #{filename}"
|
|
|
|
# Build Chosen.
|
|
#
|
|
task 'build', 'build Chosen from source', build = (cb) ->
|
|
file_name = null; file_contents = null
|
|
try
|
|
for javascript, sources of javascripts
|
|
code = ''
|
|
for source in sources
|
|
file_name = source
|
|
file_contents = "#{fs.readFileSync source}"
|
|
code += CoffeeScript.compile file_contents
|
|
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
|
|
)
|
|
package_npm () ->
|
|
cb() if typeof cb is 'function'
|
|
catch e
|
|
print_error e, file_name, file_contents
|
|
|
|
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)
|
|
|
|
task 'package_npm', 'generate the package.json file for npm', package_npm = (cb) ->
|
|
try
|
|
package_file = 'package.json'
|
|
package = JSON.parse("#{fs.readFileSync package_file}")
|
|
package['version'] = version()
|
|
fs.writeFileSync package_file, JSON.stringify(package, null, 2)
|
|
console.log "Wrote #{package_file}"
|
|
cb() if typeof cb is 'function'
|
|
catch e
|
|
print_error e, package_file
|
|
|
|
run = (cmd, args, cb, err_cb) ->
|
|
exec "#{cmd} #{args.join(' ')}", (err, stdout, stderr) ->
|
|
if err isnt null
|
|
console.error stderr
|
|
if typeof err_cb is 'function'
|
|
err_cb()
|
|
else
|
|
throw "Failed command execution (#{err})."
|
|
else
|
|
cb(stdout) if typeof cb is 'function'
|
|
|
|
with_clean_repo = (cb) ->
|
|
run 'git', ['diff', '--exit-code'], cb, ->
|
|
throw 'There are files that need to be committed first.'
|
|
|
|
without_existing_tag = (cb) ->
|
|
run 'git', ['tag'], (stdout) ->
|
|
if stdout.split("\n").indexOf( version_tag() ) >= 0
|
|
throw 'This tag has already been committed to the repo.'
|
|
else
|
|
cb()
|
|
|
|
tag_release = (cb, cb_err) ->
|
|
run 'git', ['tag', '-a', '-m', "\"Version #{version()}\"", version_tag()], cb, cb_err
|
|
|
|
untag_release = (e) ->
|
|
console.log "Failure to tag caught: #{e}"
|
|
console.log "Removing tag #{version_tag()}"
|
|
run 'git', ['tag', '-d', version_tag()]
|
|
|
|
push_repo = (args=[], cb, cb_err) ->
|
|
run 'git', ['push'].concat(args), cb, cb_err
|
|
|
|
print_error = (error, file_name, file_contents) ->
|
|
line = error.message.match /line ([0-9]+):/
|
|
if line && line[1] && line = parseInt(line[1])
|
|
contents_lines = file_contents.split "\n"
|
|
first = if line-4 < 0 then 0 else line-4
|
|
last = if line+3 > contents_lines.size then contents_lines.size else line+3
|
|
console.log "Error compiling #{file_name}. \"#{error.message}\"\n"
|
|
index = 0
|
|
for line in contents_lines[first...last]
|
|
index++
|
|
line_number = first + 1 + index
|
|
console.log "#{(' ' for [0..(3-(line_number.toString().length))]).join('')} #{line}"
|
|
else
|
|
console.log """
|
|
Error compiling #{file_name}:
|
|
|
|
#{error.message}
|
|
|
|
"""
|
|
|
|
|
|
|
|
task 'release', 'build, tag the current release, and push', ->
|
|
console.log "Trying to tag #{version_tag()}..."
|
|
with_clean_repo ->
|
|
without_existing_tag ->
|
|
build ->
|
|
tag_release ->
|
|
push_repo [], ->
|
|
push_repo ['--tags'], ->
|
|
console.log "Successfully tagged #{version_tag()}: https://github.com/harvesthq/chosen/tree/#{version_tag()}"
|
|
|
|
, untag_release
|
|
, untag_release
|
|
, untag_release
|