@honeybadger-io/webpack
Version:
Webpack plugin to upload source maps to Honeybadger's API - http://docs.honeybadger.io/guides/source-maps.html
134 lines (132 loc) • 5.69 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _path = require("path");
var _helpers = require("./helpers");
var _pluginCore = require("@honeybadger-io/plugin-core");
var PLUGIN_NAME = 'HoneybadgerSourceMapPlugin';
/**
* @typedef {Object} DeployObject
* @property {?string} environment - production, development, staging, etc
* @property {?string} repository - URL for repository IE: https://github.com/foo/bar
* @property {?string} localUsername - The name of the user deploying. IE: Jane
*/
var HoneybadgerSourceMapPlugin = /*#__PURE__*/function () {
function HoneybadgerSourceMapPlugin(options) {
(0, _classCallCheck2["default"])(this, HoneybadgerSourceMapPlugin);
this.sendDeployNotification = _pluginCore.sendDeployNotification;
this.uploadSourceMaps = _pluginCore.uploadSourcemaps;
this.options = (0, _pluginCore.cleanOptions)(options);
}
(0, _createClass2["default"])(HoneybadgerSourceMapPlugin, [{
key: "afterEmit",
value: function () {
var _afterEmit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(compilation) {
var assets, _compilation$errors, _compilation$warnings;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
if (!this.isDevEnv(this.options.developmentEnvironments)) {
_context.next = 3;
break;
}
if (!this.options.silent) {
console.info('\nHoneybadgerSourceMapPlugin will not upload source maps because webpack-dev-server is running.');
}
return _context.abrupt("return");
case 3:
_context.prev = 3;
assets = this.getAssets(compilation);
_context.next = 7;
return this.uploadSourceMaps(assets, this.options);
case 7:
if (!this.options.deploy) {
_context.next = 10;
break;
}
_context.next = 10;
return this.sendDeployNotification(this.options);
case 10:
_context.next = 15;
break;
case 12:
_context.prev = 12;
_context.t0 = _context["catch"](3);
if (!this.options.ignoreErrors) {
(_compilation$errors = compilation.errors).push.apply(_compilation$errors, (0, _toConsumableArray2["default"])((0, _helpers.handleError)(_context.t0)));
} else if (!this.options.silent) {
(_compilation$warnings = compilation.warnings).push.apply(_compilation$warnings, (0, _toConsumableArray2["default"])((0, _helpers.handleError)(_context.t0)));
}
case 15:
case "end":
return _context.stop();
}
}
}, _callee, this, [[3, 12]]);
}));
function afterEmit(_x) {
return _afterEmit.apply(this, arguments);
}
return afterEmit;
}()
}, {
key: "isDevEnv",
value: function isDevEnv(devEnvironments) {
if (process.env.WEBPACK_DEV_SERVER === 'true') {
return true;
}
return !!(devEnvironments && devEnvironments.includes(process.env.NODE_ENV));
}
}, {
key: "apply",
value: function apply(compiler) {
compiler.hooks.afterEmit.tapPromise(PLUGIN_NAME, this.afterEmit.bind(this));
}
}, {
key: "getAssetPath",
value: function getAssetPath(compilation, name) {
if (!name) {
return '';
}
return (0, _path.join)(compilation.getPath(compilation.compiler.outputPath), name.split('?')[0]);
}
}, {
key: "getAssets",
value: function getAssets(compilation) {
var _this = this;
var _compilation$getStats = compilation.getStats().toJson(),
chunks = _compilation$getStats.chunks;
return chunks.map(function (_ref) {
var files = _ref.files,
auxiliaryFiles = _ref.auxiliaryFiles;
var jsFilename = files.find(function (file) {
return /\.js$/.test(file);
});
var jsFilePath = _this.getAssetPath(compilation, jsFilename);
// Webpack 4 using chunk.files, Webpack 5 uses chunk.auxiliaryFiles
// https://webpack.js.org/blog/2020-10-10-webpack-5-release/#stats
var sourcemapFilename = (auxiliaryFiles || files).find(function (file) {
return /\.js\.map$/.test(file);
});
var sourcemapFilePath = _this.getAssetPath(compilation, sourcemapFilename);
return {
sourcemapFilename: sourcemapFilename,
sourcemapFilePath: sourcemapFilePath,
jsFilename: jsFilename,
jsFilePath: jsFilePath
};
}).filter(function (_ref2) {
var sourcemapFilename = _ref2.sourcemapFilename,
jsFilename = _ref2.jsFilename;
return sourcemapFilename && jsFilename;
});
}
}]);
return HoneybadgerSourceMapPlugin;
}();
module.exports = HoneybadgerSourceMapPlugin;