/ src / babel.js
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  }