#!/usr/bin/env ruby require 'rubygems' require 'fileutils' require 'coffee-script' require 'dependence' require 'optparse' class DependenceCompiler def initialize(config) @config = config @load_path = config[:src_dir] ext_list = Dependence::Compiler.supported_extensions() @source_type = "**/*{#{ext_list.join(',')}}" end def compile begin @config[:watch] ? compile_with_watcher : run_compile rescue => e puts Colors.red("Error during processing, exiting.") raise e end end private def compile_with_watcher FileWatcher.new(:load_path => @load_path, :glob_str => @source_type) do print "File change detected. Recompiling... " begin run_compile puts "done." rescue => e puts Colors.red("Error: " + e.to_s) end end end def run_compile create_output_directory() module_dirs = Dir.glob("#{@load_path}/*/**/").map {|dir| File.expand_path(dir) } module_dirs.delete(File.expand_path(@config[:output])) module_dirs.each do |module_dir| Dependence::JsModule.new(:source_dir => module_dir, :output_dir => @config[:output], :source_type => @source_type, :bare => @config[:bare], :compress => @config[:compress]).to_file end end def create_output_directory FileUtils.mkdir_p @config[:output] end def compress_code(source_file) JsCompressor.new(source_file).compile end end options = { :output => ".", :watch => false, :bare => false, :compress => false } OptionParser.new do |opts| opts.banner = "Usage: src_dir [options]" opts.on("-o", "--output DIR", "Output directory, defaults to '.'") do |dir| options[:output] = dir end opts.on("-w", "--watch", "Watch src_dir for changes and recompile") do |bool| options[:watch] = bool end opts.on("-b", "--bare", "Do not wrap modules in closures with export var") do |bool| options[:bare] = bool end opts.on("-c", "--compress", "Compress output with Googles Closure compiler") do |bool| options[:compress] = bool end end.parse(ARGV) if ARGV.length < 1 puts "You need a src directory to compile from!" exit 1 elsif !File.directory? ARGV[0] puts "#{ARGV[0]} is not a directory!" exit 1 end options[:src_dir] = ARGV[0] compiler = DependenceCompiler.new options compiler.compile