pundle-loader-js
Version:
Javascript loader for Pundle
103 lines (85 loc) • 3.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _babylon = require('babylon');
var _babelTraverse = require('babel-traverse');
var _babelTraverse2 = _interopRequireDefault(_babelTraverse);
var _babelGenerator = require('babel-generator');
var _babelGenerator2 = _interopRequireDefault(_babelGenerator);
var _pundleApi = require('pundle-api');
var _helpers = require('./helpers');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var RESOLVE_NAMES = new Set(['require', 'require.resolve', 'module.hot.accept', 'module.hot.decline']);
var RESOLVE_NAMES_SENSITIVE = new Set(['require', 'require.resolve']);
exports.default = (0, _pundleApi.createLoader)(function (config, file) {
var _this = this;
if (!(0, _pundleApi.shouldProcess)(this.config.rootDirectory, file.filePath, config)) {
return null;
}
var imports = [];
var ast = void 0;
try {
ast = (0, _babylon.parse)(file.contents, {
sourceType: 'module',
sourceFilename: file.filePath,
plugins: ['jsx', 'flow', 'doExpressions', 'objectRestSpread', 'decorators', 'classProperties', 'exportExtensions', 'asyncGenerators', 'functionBind', 'functionSent', 'dynamicImport']
});
} catch (error) {
var errorMessage = error.message + ' in ' + (0, _pundleApi.getRelativeFilePath)(file.filePath, this.config.rootDirectory);
if (error.loc) {
throw new _pundleApi.FileIssue(file.contents, error.loc.line, error.loc.column + 1, errorMessage, 'error');
} else {
throw new _pundleApi.MessageIssue(errorMessage, 'error');
}
}
var processResolve = function processResolve(node) {
if (typeof node.value === 'string') {
var request = _this.getImportRequest(node.value, file.filePath);
imports.push(request);
node.value = request.id.toString();
}
};
var processReplaceable = function processReplaceable(path) {
var name = (0, _helpers.getName)(path.node);
if ({}.hasOwnProperty.call(_this.config.replaceVariables, name)) {
path.replaceWith((0, _helpers.getParsedReplacement)(_this.config.replaceVariables[name]));
}
};
(0, _babelTraverse2.default)(ast, {
ImportDeclaration: function ImportDeclaration(path) {
processResolve(path.node.source);
},
CallExpression: function CallExpression(path) {
var name = (0, _helpers.getName)(path.node.callee);
if (!RESOLVE_NAMES.has(name)) {
return;
}
var parameter = path.node.arguments && path.node.arguments[0];
if (!parameter || typeof parameter.value !== 'string') {
return;
}
if (RESOLVE_NAMES_SENSITIVE.has(name) && path.scope.hasBinding('require')) {
return;
}
processResolve(parameter);
},
Identifier: processReplaceable,
MemberExpression: processReplaceable
});
var compiled = (0, _babelGenerator2.default)(ast, {
quotes: 'single',
compact: true,
comments: false,
filename: file.filePath,
sourceMaps: true,
sourceFileName: file.filePath
});
return {
imports: imports,
contents: compiled.code,
sourceMap: compiled.map
};
}, {
extensions: ['js', 'jsx']
});