make 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/env coffee
  2. require 'shelljs/make'
  3. fs = require 'fs'
  4. zepto_js = 'dist/zepto.js'
  5. zepto_min = 'dist/zepto.min.js'
  6. zepto_gz = 'dist/zepto.min.gz'
  7. port = 3999
  8. root = __dirname + '/'
  9. target.all = ->
  10. target[zepto_js]()
  11. target.test()
  12. ## TASKS ##
  13. target.test = ->
  14. test_app = require './test/server'
  15. server = test_app.listen port
  16. exec "phantomjs --disk-cache=true test/runner.js 'http://localhost:#{port}/'", (code) ->
  17. server.close -> exit(code)
  18. target[zepto_js] = ->
  19. target.build() unless test('-e', zepto_js)
  20. target[zepto_min] = ->
  21. target.minify() if stale(zepto_min, zepto_js)
  22. target[zepto_gz] = ->
  23. target.compress() if stale(zepto_gz, zepto_min)
  24. target.dist = ->
  25. target.build()
  26. target.minify()
  27. target.compress()
  28. target.build = ->
  29. cd __dirname
  30. mkdir '-p', 'dist'
  31. modules = (env['MODULES'] || 'zepto event ajax form ie').split(' ')
  32. module_files = ( "src/#{module}.js" for module in modules )
  33. intro = "/* Zepto #{describe_version()} - #{modules.join(' ')} - zeptojs.com/license */\n"
  34. dist = cat(module_files).replace(/^\/[\/*].*$/mg, '').replace(/\n{3,}/g, "\n\n")
  35. dist = cat('src/amd_layout.js').replace(/YIELD/, -> dist.trim()) unless env['NOAMD']
  36. (intro + dist).to(zepto_js)
  37. report_size(zepto_js)
  38. target.minify = ->
  39. target.build() unless test('-e', zepto_js)
  40. zepto_code = cat(zepto_js)
  41. intro = zepto_code.slice(0, zepto_code.indexOf("\n") + 1)
  42. (intro + minify(zepto_code)).to(zepto_min)
  43. report_size(zepto_min)
  44. target.compress = ->
  45. gzip = require('zlib').createGzip()
  46. inp = fs.createReadStream(zepto_min)
  47. out = fs.createWriteStream(zepto_gz)
  48. inp.pipe(gzip).pipe(out)
  49. out.on 'close', ->
  50. report_size(zepto_gz)
  51. factor = fsize(zepto_js) / fsize(zepto_gz)
  52. echo "compression factor: #{format_number(factor)}"
  53. target.publish = ->
  54. tag = 'v' + package_version()
  55. if git_version() == tag
  56. rm '-f', zepto_js
  57. env['MODULES'] = env['NOAMD'] = ''
  58. target.dist()
  59. res = exec 'npm publish'
  60. exit res.code
  61. else
  62. console.error 'error: latest commit should be tagged with ' + tag
  63. exit 1
  64. ## HELPERS ##
  65. stale = (file, source) ->
  66. target[source]()
  67. !test('-e', file) || mtime(file) < mtime(source)
  68. mtime = (file) ->
  69. fs.statSync(file).mtime.getTime()
  70. fsize = (file) ->
  71. fs.statSync(file).size
  72. format_number = (size, precision = 1) ->
  73. factor = Math.pow(10, precision)
  74. decimal = Math.round(size * factor) % factor
  75. parseInt(size) + "." + decimal
  76. report_size = (file) ->
  77. echo "#{file}: #{format_number(fsize(file) / 1024)} KiB"
  78. package_version = ->
  79. JSON.parse(cat('package.json')).version
  80. git_version = ->
  81. desc = exec "git --git-dir='#{root + '.git'}' describe --tags HEAD", silent: true
  82. desc.output.replace(/\s+$/, '') if desc.code is 0
  83. describe_version = ->
  84. git_version() || package_version()
  85. minify = (source_code) ->
  86. uglify = require('uglify-js')
  87. compressor = uglify.Compressor()
  88. ast = uglify.parse(source_code)
  89. ast.figure_out_scope()
  90. ast.compute_char_frequency()
  91. ast.mangle_names()
  92. ast = ast.transform(compressor)
  93. return ast.print_to_string()