# TODO: Automate updating links to docs and cdn with version number change
fs = require('fs')
path = require('path')
{spawnSync} = require('child_process')
wrench = require('wrench')
findRemoveSync = require('find-remove')
marked = require('marked')
uglify = require("uglify-js")
browserify = require('browserify')
#fileify = require('fileify-lm')
_ = require('lodash')
runSync = (command, options, next) -> # !TODO: Upgrade to runSync in node-localstorage
{stderr, stdout} = runSyncRaw(command, options)
if stderr?.length > 0
console.error("Error running `#{command}`\n" + stderr)
process.exit(1)
if next?
next(stdout)
else
if stdout?.length > 0
console.log("Stdout running command '#{command}'...\n" + stdout)
runSyncNoExit = (command, options = []) ->
{stderr, stdout} = runSyncRaw(command, options)
console.log("Output of running '#{command + ' ' + options.join(' ')}'...\n#{stderr}\n#{stdout}\n")
return {stderr, stdout}
runSyncRaw = (command, options) ->
output = spawnSync(command, options)
stdout = output.stdout?.toString()
stderr = output.stderr?.toString()
return {stderr, stdout}
task('doctest', 'Test examples in documenation.', () ->
process.chdir(__dirname)
runSync('coffeedoctest', ['--readme', 'src', 'lumenize.coffee'])
)
task('docs', 'Generate docs with JSDuckify/JSDuck and place in ./docs', () ->
runSync('cake doctest')
process.chdir(__dirname)
# create README.html
readmeDotCSSString = fs.readFileSync('read-me.css', 'utf8')
readmeDotMDString = fs.readFileSync('README.md', 'utf8')
readmeDotHTMLString = marked(readmeDotMDString)
readmeDotHTMLString = """
#{readmeDotHTMLString}
"""
fs.writeFileSync(path.join(__dirname, 'docs', 'README.html'), readmeDotHTMLString)
# jsduckify
{name, version} = require('./package.json')
outputDirectory = path.join(__dirname, 'docs', "#{name}-docs")
if fs.existsSync(outputDirectory)
wrench.rmdirSyncRecursive(outputDirectory, false)
process.chdir(__dirname)
runSync('jsduckify', ['-d', outputDirectory, __dirname])
)
task('publish', 'Publish to npm and add git tags', () ->
process.chdir(__dirname)
console.log('Running tests')
process.chdir(__dirname)
runSync('cake', ['test']) # Doing this externally to make it synchronous
invoke('build')
invoke('docs')
console.log('Checking git status --porcelain')
runSync('git', ['status', '--porcelain'], (stdout) ->
if stdout.length == 0
console.log('checking origin/master')
{stderr, stdout} = runSyncNoExit('git', ['rev-parse', 'origin/master'])
console.log('checking master')
stdoutOrigin = stdout
{stderr, stdout} = runSyncNoExit('git', ['rev-parse', 'master'])
stdoutMaster = stdout
if stdoutOrigin == stdoutMaster
console.log('running npm publish')
runSyncNoExit('npm', ['publish', '.'])
if fs.existsSync('npm-debug.log')
console.error('`npm publish` failed. See npm-debug.log for details.')
else
console.log('creating git tag')
runSyncNoExit("git", ["tag", "v#{require('./package.json').version}"])
runSyncNoExit("git", ["push", "--tags"])
console.log('removing .js and .map files')
invoke('clean')
else
console.error('Origin and master out of sync. Not publishing.')
else
console.error('`git status --porcelain` was not clean. Not publishing.')
)
)
task('build', 'Build with browserify and place in ./deploy', () ->
console.log('building...')
invoke('update-bower-version')
console.log('Compiling...')
runSyncNoExit('coffee', ['--compile', 'lumenize.coffee', 'src'])
b = browserify()
b.require('./lumenize', {expose: 'lumenize'})
b.transform('brfs')
b.bundle((err, buf) ->
fileString = buf.toString('utf8')
{name, version} = require('./package.json')
fileString = """
/*
#{name} version: #{version}
*/
#{fileString}
"""
deployFileName = "deploy/#{name}.js"
unless fs.existsSync('deploy')
fs.mkdirSync('deploy')
fs.writeFileSync(deployFileName, fileString)
minFileString = uglify.minify(deployFileName).code
fs.writeFileSync("deploy/#{name}-min.js", minFileString)
console.log('done')
# !TODO: Need to run tests on the built version
)
)
task('update-bower-version', 'Update bower.json with the version number specified in package.json', () ->
bowerJSON = require('./bower.json')
bowerJSON.version = require('./package.json').version
fs.writeFileSync("./bower.json", JSON.stringify(bowerJSON, null, 2))
)
task('test', 'Run the test suite with nodeunit and record coverage.', () ->
process.chdir(__dirname)
require('coffee-coverage/register-istanbul')
findRemoveSync('src', {extensions: ['.js', '.map']})
{reporters} = require('nodeunit')
reporters.default.run(['test'], undefined, (failure) ->
if failure?
console.error(failure)
process.exit(1)
else
console.log('To see coverage report, run `istanbul report` and `open coverage/lcov-report/Lumenize/src/index.html`')
)
)
task('testall', 'Run tests and doctests', () ->
runSync('cake', ['test'])
runSync('cake', ['doctest'])
runSync('istanbul', ['report', 'text-summary', 'lcov'])
)
task('clean', 'Deletes .js and .map files', () ->
folders = ['.', 'test', 'src']
for folder in folders
pathToClean = path.join(__dirname, folder)
contents = fs.readdirSync(pathToClean)
for file in contents when (_.endsWith(file, '.js') or _.endsWith(file, '.map'))
fs.unlinkSync(path.join(pathToClean, file))
)