fs = require 'fs' path = require 'path' _ = require 'underscore' { spawn, exec, execSync } = require 'child_process' CoffeeScript = require './lib/coffee-script' helpers = require './lib/coffee-script/helpers' # ANSI Terminal Colors. bold = red = green = reset = '' unless process.env.NODE_DISABLE_COLORS bold = '\x1B[0;1m' red = '\x1B[0;31m' green = '\x1B[0;32m' reset = '\x1B[0m' # Built file header. header = """ /** * CoffeeScript Compiler v#{CoffeeScript.VERSION} * http://coffeescript.org * * Copyright 2011, Jeremy Ashkenas * Released under the MIT License */ """ # Used in folder names like docs/v1 majorVersion = CoffeeScript.VERSION.split('.')[0] # Build the CoffeeScript language from source. build = (cb) -> files = fs.readdirSync 'src' files = ('src/' + file for file in files when file.match(/\.(lit)?coffee$/)) run ['-c', '-o', 'lib/coffee-script'].concat(files), cb # Run a CoffeeScript through our node/coffee interpreter. run = (args, cb) -> proc = spawn 'node', ['bin/coffee'].concat(args) proc.stderr.on 'data', (buffer) -> console.log buffer.toString() proc.on 'exit', (status) -> process.exit(1) if status isnt 0 cb() if typeof cb is 'function' # Log a message with a color. log = (message, color, explanation) -> console.log color + message + reset + ' ' + (explanation or '') option '-p', '--prefix [DIR]', 'set the installation prefix for `cake install`' task 'install', 'install CoffeeScript into /usr/local (or --prefix)', (options) -> base = options.prefix or '/usr/local' lib = "#{base}/lib/coffee-script" bin = "#{base}/bin" node = "~/.node_libraries/coffee-script" console.log "Installing CoffeeScript to #{lib}" console.log "Linking to #{node}" console.log "Linking 'coffee' to #{bin}/coffee" exec([ "mkdir -p #{lib} #{bin}" "cp -rf bin lib LICENSE README.md package.json src #{lib}" "ln -sfn #{lib}/bin/coffee #{bin}/coffee" "ln -sfn #{lib}/bin/cake #{bin}/cake" "mkdir -p ~/.node_libraries" "ln -sfn #{lib}/lib/coffee-script #{node}" ].join(' && '), (err, stdout, stderr) -> if err then console.log stderr.trim() else log 'done', green ) task 'build', 'build the CoffeeScript language from source', build task 'build:full', 'rebuild the source twice, and run the tests', -> build -> build -> csPath = './lib/coffee-script' csDir = path.dirname require.resolve csPath for mod of require.cache when csDir is mod[0 ... csDir.length] delete require.cache[mod] unless runTests require csPath process.exit 1 task 'build:parser', 'rebuild the Jison parser (run build first)', -> helpers.extend global, require 'util' require 'jison' parser = require('./lib/coffee-script/grammar').parser fs.writeFileSync 'lib/coffee-script/parser.js', parser.generate() task 'build:browser', 'rebuild the merged script for inclusion in the browser', -> code = '' for name in ['helpers', 'rewriter', 'lexer', 'parser', 'scope', 'nodes', 'sourcemap', 'coffee-script', 'browser'] code += """ require['./#{name}'] = (function() { var exports = {}, module = {exports: exports}; #{fs.readFileSync "lib/coffee-script/#{name}.js"} return module.exports; })(); """ code = """ (function(root) { var CoffeeScript = function() { function require(path){ return require[path]; } #{code} return require['./coffee-script']; }(); if (typeof define === 'function' && define.amd) { define(function() { return CoffeeScript; }); } else { root.CoffeeScript = CoffeeScript; } }(this)); """ unless process.env.MINIFY is 'false' {compiledCode} = require('google-closure-compiler-js').compile jsCode: [ src: code languageOut: if majorVersion is 1 then 'ES5' else 'ES6' ] outputFolder = "docs/v#{majorVersion}/browser-compiler" fs.mkdirSync outputFolder unless fs.existsSync outputFolder fs.writeFileSync "#{outputFolder}/coffee-script.js", header + '\n' + compiledCode console.log "built ... running browser tests:" invoke 'test:browser' task 'doc:site', 'watch and continually rebuild the documentation for the website', -> # Helpers css = fs.readFileSync('./documentation/css/docs.css', 'utf-8') + '\n' + fs.readFileSync('./documentation/css/tomorrow.css', 'utf-8') logo = fs.readFileSync './documentation/images/logo.svg', 'utf-8' codeFor = -> counter = 0 hljs = require 'highlight.js' hljs.configure classPrefix: '' (file, executable = false, showLoad = true) -> counter++ return unless fs.existsSync "docs/v#{majorVersion}/examples/#{file}.js" cs = fs.readFileSync "documentation/examples/#{file}.coffee", 'utf-8' js = fs.readFileSync "docs/v#{majorVersion}/examples/#{file}.js", 'utf-8' js = js.replace /^\/\/ generated.*?\n/i, '' cshtml = "
#{hljs.highlight('coffeescript', cs).value}"
# Temporary fix until highlight.js adds support for newer CoffeeScript keywords
# Added in https://github.com/isagalaev/highlight.js/pull/1357, awaiting release
if file in ['generator_iteration', 'generators', 'modules']
cshtml = cshtml.replace /(yield|import|export|from|as|default) /g, '$1 '
jshtml = "#{hljs.highlight('javascript', js).value}"
append = if executable is yes then '' else "alert(#{executable});".replace /"/g, '"'
if executable and executable isnt yes
cs.replace /(\S)\s*\Z/m, "$1\n\nalert #{executable}"
run = if executable is true then 'run' else "run: #{executable}"
name = "example#{counter}"
script = ""
load = if showLoad then "" else ''
button = if executable then """""" else ''
"