1 | 'use strict';
|
2 |
|
3 | var assign = require('object-assign');
|
4 | var babel = require('babel-core');
|
5 | var loaderUtils = require('loader-utils');
|
6 | var cache = require('./lib/fs-cache.js');
|
7 | var exists = require('./lib/helpers/exists')();
|
8 | var read = require('./lib/helpers/read')();
|
9 | var resolveRc = require('./lib/resolve-rc.js');
|
10 | var pkg = require('./package.json');
|
11 | var path = require('path');
|
12 |
|
13 | var transpile = function(source, options) {
|
14 | var result = babel.transform(source, options);
|
15 | var code = result.code;
|
16 | var map = result.map;
|
17 |
|
18 | if (map && (!map.sourcesContent || !map.sourcesContent.length)) {
|
19 | map.sourcesContent = [source];
|
20 | }
|
21 |
|
22 | return {
|
23 | code: code,
|
24 | map: map,
|
25 | };
|
26 | };
|
27 |
|
28 | module.exports = function(source, inputSourceMap) {
|
29 | var result = {};
|
30 |
|
31 |
|
32 | var globalOptions = this.options.babel || {};
|
33 | var loaderOptions = loaderUtils.parseQuery(this.query);
|
34 | var userOptions = assign({}, globalOptions, loaderOptions);
|
35 | var defaultOptions = {
|
36 | inputSourceMap: inputSourceMap,
|
37 | sourceRoot: process.cwd(),
|
38 | filename: loaderUtils.getRemainingRequest(this),
|
39 | cacheIdentifier: JSON.stringify({
|
40 | 'babel-loader': pkg.version,
|
41 | 'babel-core': babel.version,
|
42 | babelrc: exists(userOptions.babelrc) ?
|
43 | read(userOptions.babelrc) :
|
44 | resolveRc(process.cwd()),
|
45 | env: process.env.BABEL_ENV || process.env.NODE_ENV,
|
46 | }),
|
47 | };
|
48 |
|
49 | var options = assign({}, defaultOptions, userOptions);
|
50 |
|
51 | if (userOptions.sourceMap === undefined) {
|
52 | options.sourceMap = this.sourceMap;
|
53 | }
|
54 |
|
55 | if (options.sourceFileName === undefined) {
|
56 | options.sourceFileName = path.relative(
|
57 | options.sourceRoot,
|
58 | options.filename
|
59 | );
|
60 | }
|
61 |
|
62 | var cacheDirectory = options.cacheDirectory;
|
63 | var cacheIdentifier = options.cacheIdentifier;
|
64 |
|
65 | delete options.cacheDirectory;
|
66 | delete options.cacheIdentifier;
|
67 |
|
68 | this.cacheable();
|
69 |
|
70 | if (cacheDirectory) {
|
71 | var callback = this.async();
|
72 | return cache({
|
73 | directory: cacheDirectory,
|
74 | identifier: cacheIdentifier,
|
75 | source: source,
|
76 | options: options,
|
77 | transform: transpile,
|
78 | }, function(err, result) {
|
79 | if (err) { return callback(err); }
|
80 | return callback(null, result.code, result.map);
|
81 | });
|
82 | } else {
|
83 | result = transpile(source, options);
|
84 | this.callback(null, result.code, result.map);
|
85 | }
|
86 | };
|