UNPKG

4.14 kBJavaScriptView Raw
1"use strict";
2
3var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
4
5var assign = require("object-assign");
6var babel = require("babel-core");
7var loaderUtils = require("loader-utils");
8var path = require("path");
9var cache = require("./fs-cache.js");
10var exists = require("./utils/exists")();
11var relative = require("./utils/relative");
12var read = require("./utils/read")();
13var resolveRc = require("./resolve-rc.js");
14var pkg = require("./../package.json");
15
16function BabelLoaderError(name, message, codeFrame, hideStack, error) {
17 Error.call(this);
18 Error.captureStackTrace(this, BabelLoaderError);
19
20 this.name = "BabelLoaderError";
21 this.message = formatMessage(name, message, codeFrame);
22 this.hideStack = hideStack;
23 this.error = error;
24}
25
26BabelLoaderError.prototype = Object.create(Error.prototype);
27BabelLoaderError.prototype.constructor = BabelLoaderError;
28
29var STRIP_FILENAME_RE = /^[^:]+: /;
30
31var formatMessage = function formatMessage(name, message, codeFrame) {
32 return (name ? name + ": " : "") + message + "\n\n" + codeFrame + "\n";
33};
34
35var transpile = function transpile(source, options) {
36 var result = void 0;
37 try {
38 result = babel.transform(source, options);
39 } catch (error) {
40 if (error.message && error.codeFrame) {
41 var message = error.message;
42 var name = void 0;
43 var hideStack = void 0;
44 if (error instanceof SyntaxError) {
45 message = message.replace(STRIP_FILENAME_RE, "");
46 name = "SyntaxError";
47 hideStack = true;
48 } else if (error instanceof TypeError) {
49 message = message.replace(STRIP_FILENAME_RE, "");
50 hideStack = true;
51 }
52 throw new BabelLoaderError(name, message, error.codeFrame, hideStack, error);
53 } else {
54 throw error;
55 }
56 }
57 var code = result.code;
58 var map = result.map;
59
60 if (map && (!map.sourcesContent || !map.sourcesContent.length)) {
61 map.sourcesContent = [source];
62 }
63
64 return {
65 code: code,
66 map: map
67 };
68};
69
70module.exports = function (source, inputSourceMap) {
71 var _this = this;
72
73 var result = {};
74
75 var webpackRemainingChain = loaderUtils.getRemainingRequest(this).split("!");
76 var filename = webpackRemainingChain[webpackRemainingChain.length - 1];
77
78 var globalOptions = this.options.babel || {};
79 var loaderOptions = loaderUtils.parseQuery(this.query);
80 var userOptions = assign({}, globalOptions, loaderOptions);
81 var defaultOptions = {
82 inputSourceMap: inputSourceMap,
83 sourceRoot: process.cwd(),
84 filename: filename,
85 cacheIdentifier: JSON.stringify({
86 "babel-loader": pkg.version,
87 "babel-core": babel.version,
88 babelrc: exists(userOptions.babelrc) ? read(userOptions.babelrc) : resolveRc(path.dirname(filename)),
89 env: process.env.BABEL_ENV || process.env.NODE_ENV
90 })
91 };
92
93 var options = assign({}, defaultOptions, userOptions);
94
95 if (userOptions.sourceMap === undefined) {
96 options.sourceMap = this.sourceMap;
97 }
98
99 if (options.sourceFileName === undefined) {
100 options.sourceFileName = relative(options.sourceRoot, options.filename);
101 }
102
103 var cacheDirectory = options.cacheDirectory;
104 var cacheIdentifier = options.cacheIdentifier;
105
106 delete options.cacheDirectory;
107 delete options.cacheIdentifier;
108
109 this.cacheable();
110
111 if (cacheDirectory) {
112 var _ret = function () {
113 var callback = _this.async();
114 return {
115 v: cache({
116 directory: cacheDirectory,
117 identifier: cacheIdentifier,
118 source: source,
119 options: options,
120 transform: transpile
121 }, function (err, result) {
122 if (err) {
123 return callback(err);
124 }
125 return callback(null, result.code, result.map);
126 })
127 };
128 }();
129
130 if ((typeof _ret === "undefined" ? "undefined" : _typeof(_ret)) === "object") return _ret.v;
131 }
132
133 result = transpile(source, options);
134 this.callback(null, result.code, result.map);
135};
\No newline at end of file