UNPKG

pundle-loader-js

Version:

Javascript loader for Pundle

103 lines (85 loc) 3.21 kB
'use strict'; 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'] });