'use strict'; var crypto = require('crypto'); var path = require('path'); var defaultOptions = require('../static/babelrc.json'); var babel = null; var babelVersionDirectory = null; var PREFIXES = [ '/** @babel */', '"use babel"', "'use babel'", '/* @flow */', '// @flow' ]; var PREFIX_LENGTH = Math.max.apply( Math, PREFIXES.map(function(prefix) { return prefix.length; }) ); exports.shouldCompile = function(sourceCode) { var start = sourceCode.substr(0, PREFIX_LENGTH); return PREFIXES.some(function(prefix) { return start.indexOf(prefix) === 0; }); }; exports.getCachePath = function(sourceCode) { if (babelVersionDirectory == null) { var babelVersion = require('babel-core/package.json').version; babelVersionDirectory = path.join( 'js', 'babel', createVersionAndOptionsDigest(babelVersion, defaultOptions) ); } return path.join( babelVersionDirectory, crypto .createHash('sha1') .update(sourceCode, 'utf8') .digest('hex') + '.js' ); }; exports.compile = function(sourceCode, filePath) { if (!babel) { babel = require('babel-core'); var Logger = require('babel-core/lib/transformation/file/logger'); var noop = function() {}; Logger.prototype.debug = noop; Logger.prototype.verbose = noop; } if (process.platform === 'win32') { filePath = 'file:///' + path.resolve(filePath).replace(/\\/g, '/'); } var options = { filename: filePath }; for (var key in defaultOptions) { options[key] = defaultOptions[key]; } return babel.transform(sourceCode, options).code; }; function createVersionAndOptionsDigest(version, options) { return crypto .createHash('sha1') .update('babel-core', 'utf8') .update('\0', 'utf8') .update(version, 'utf8') .update('\0', 'utf8') .update(JSON.stringify(options), 'utf8') .digest('hex'); }