123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- "use strict";
- var babel = require("babel-core");
- var loaderUtils = require("loader-utils");
- var path = require("path");
- var cache = require("./fs-cache.js");
- var exists = require("./utils/exists");
- var relative = require("./utils/relative");
- var read = require("./utils/read");
- var resolveRc = require("./resolve-rc.js");
- var pkg = require("../package.json");
- var fs = require("fs");
- /**
- * Error thrown by Babel formatted to conform to Webpack reporting.
- */
- function BabelLoaderError(name, message, codeFrame, hideStack, error) {
- Error.call(this);
- this.name = "BabelLoaderError";
- this.message = formatMessage(name, message, codeFrame);
- this.hideStack = hideStack;
- this.error = error;
- Error.captureStackTrace(this, BabelLoaderError);
- }
- BabelLoaderError.prototype = Object.create(Error.prototype);
- BabelLoaderError.prototype.constructor = BabelLoaderError;
- var STRIP_FILENAME_RE = /^[^:]+: /;
- var formatMessage = function formatMessage(name, message, codeFrame) {
- return (name ? name + ": " : "") + message + "\n\n" + codeFrame + "\n";
- };
- var transpile = function transpile(source, options) {
- var forceEnv = options.forceEnv;
- var tmpEnv = void 0;
- delete options.forceEnv;
- if (forceEnv) {
- tmpEnv = process.env.BABEL_ENV;
- process.env.BABEL_ENV = forceEnv;
- }
- var result = void 0;
- try {
- result = babel.transform(source, options);
- } catch (error) {
- if (forceEnv) restoreBabelEnv(tmpEnv);
- if (error.message && error.codeFrame) {
- var message = error.message;
- var name = void 0;
- var hideStack = void 0;
- if (error instanceof SyntaxError) {
- message = message.replace(STRIP_FILENAME_RE, "");
- name = "SyntaxError";
- hideStack = true;
- } else if (error instanceof TypeError) {
- message = message.replace(STRIP_FILENAME_RE, "");
- hideStack = true;
- }
- throw new BabelLoaderError(name, message, error.codeFrame, hideStack, error);
- } else {
- throw error;
- }
- }
- var code = result.code;
- var map = result.map;
- var metadata = result.metadata;
- if (map && (!map.sourcesContent || !map.sourcesContent.length)) {
- map.sourcesContent = [source];
- }
- if (forceEnv) restoreBabelEnv(tmpEnv);
- return {
- code: code,
- map: map,
- metadata: metadata
- };
- };
- function restoreBabelEnv(prevValue) {
- if (prevValue === undefined) {
- delete process.env.BABEL_ENV;
- } else {
- process.env.BABEL_ENV = prevValue;
- }
- }
- function passMetadata(s, context, metadata) {
- if (context[s]) {
- context[s](metadata);
- }
- }
- module.exports = function (source, inputSourceMap) {
- var _this = this;
- var filename = this.resourcePath;
- // Handle options
- var loaderOptions = loaderUtils.getOptions(this) || {};
- var fileSystem = this.fs ? this.fs : fs;
- var babelrcPath = null;
- if (loaderOptions.babelrc !== false) {
- babelrcPath = typeof loaderOptions.babelrc === "string" && exists(fileSystem, loaderOptions.babelrc) ? loaderOptions.babelrc : resolveRc(fileSystem, path.dirname(filename));
- }
- if (babelrcPath) {
- this.addDependency(babelrcPath);
- }
- var defaultOptions = {
- metadataSubscribers: [],
- inputSourceMap: inputSourceMap,
- sourceRoot: process.cwd(),
- filename: filename,
- cacheIdentifier: JSON.stringify({
- "babel-loader": pkg.version,
- "babel-core": babel.version,
- babelrc: babelrcPath ? read(fileSystem, babelrcPath) : null,
- env: loaderOptions.forceEnv || process.env.BABEL_ENV || process.env.NODE_ENV || "development"
- })
- };
- var options = Object.assign({}, defaultOptions, loaderOptions);
- if (loaderOptions.sourceMap === undefined) {
- options.sourceMap = this.sourceMap;
- }
- if (options.sourceFileName === undefined) {
- options.sourceFileName = relative(options.sourceRoot, options.filename);
- }
- var cacheDirectory = options.cacheDirectory;
- var cacheIdentifier = options.cacheIdentifier;
- var metadataSubscribers = options.metadataSubscribers;
- delete options.cacheDirectory;
- delete options.cacheIdentifier;
- delete options.metadataSubscribers;
- if (cacheDirectory) {
- var callback = this.async();
- return cache({
- directory: cacheDirectory,
- identifier: cacheIdentifier,
- source: source,
- options: options,
- transform: transpile
- }, function (err) {
- var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
- code = _ref.code,
- map = _ref.map,
- metadata = _ref.metadata;
- if (err) return callback(err);
- metadataSubscribers.forEach(function (s) {
- return passMetadata(s, _this, metadata);
- });
- return callback(null, code, map);
- });
- }
- var _transpile = transpile(source, options),
- code = _transpile.code,
- map = _transpile.map,
- metadata = _transpile.metadata;
- metadataSubscribers.forEach(function (s) {
- return passMetadata(s, _this, metadata);
- });
- this.callback(null, code, map);
- };
|