babel.js
1 'use strict'; 2 3 var crypto = require('crypto'); 4 var path = require('path'); 5 var defaultOptions = require('../static/babelrc.json'); 6 7 var babel = null; 8 var babelVersionDirectory = null; 9 10 var PREFIXES = [ 11 '/** @babel */', 12 '"use babel"', 13 "'use babel'", 14 '/* @flow */', 15 '// @flow' 16 ]; 17 18 var PREFIX_LENGTH = Math.max.apply( 19 Math, 20 PREFIXES.map(function(prefix) { 21 return prefix.length; 22 }) 23 ); 24 25 exports.shouldCompile = function(sourceCode) { 26 var start = sourceCode.substr(0, PREFIX_LENGTH); 27 return PREFIXES.some(function(prefix) { 28 return start.indexOf(prefix) === 0; 29 }); 30 }; 31 32 exports.getCachePath = function(sourceCode) { 33 if (babelVersionDirectory == null) { 34 var babelVersion = require('babel-core/package.json').version; 35 babelVersionDirectory = path.join( 36 'js', 37 'babel', 38 createVersionAndOptionsDigest(babelVersion, defaultOptions) 39 ); 40 } 41 42 return path.join( 43 babelVersionDirectory, 44 crypto 45 .createHash('sha1') 46 .update(sourceCode, 'utf8') 47 .digest('hex') + '.js' 48 ); 49 }; 50 51 exports.compile = function(sourceCode, filePath) { 52 if (!babel) { 53 babel = require('babel-core'); 54 var Logger = require('babel-core/lib/transformation/file/logger'); 55 var noop = function() {}; 56 Logger.prototype.debug = noop; 57 Logger.prototype.verbose = noop; 58 } 59 60 if (process.platform === 'win32') { 61 filePath = 'file:///' + path.resolve(filePath).replace(/\\/g, '/'); 62 } 63 64 var options = { filename: filePath }; 65 for (var key in defaultOptions) { 66 options[key] = defaultOptions[key]; 67 } 68 return babel.transform(sourceCode, options).code; 69 }; 70 71 function createVersionAndOptionsDigest(version, options) { 72 return crypto 73 .createHash('sha1') 74 .update('babel-core', 'utf8') 75 .update('\0', 'utf8') 76 .update(version, 'utf8') 77 .update('\0', 'utf8') 78 .update(JSON.stringify(options), 'utf8') 79 .digest('hex'); 80 }