UNPKG

4.34 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _babylon = require('babylon');
8
9var _babelTraverse = require('babel-traverse');
10
11var _babelTraverse2 = _interopRequireDefault(_babelTraverse);
12
13var _babelGenerator = require('babel-generator');
14
15var _babelGenerator2 = _interopRequireDefault(_babelGenerator);
16
17var _pundleApi = require('pundle-api');
18
19var _helpers = require('./helpers');
20
21var Helpers = _interopRequireWildcard(_helpers);
22
23function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
24
25function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
27function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
28
29var RESOLVE_NAMES = new Set(['require', 'require.ensure', 'require.resolve', 'module.hot.accept', 'module.hot.decline']);
30var RESOLVE_NAMES_SENSITIVE = new Set(['require', 'require.resolve']);
31
32exports.default = (0, _pundleApi.createLoader)(function () {
33 var _ref = _asyncToGenerator(function* (context, config, file) {
34 if (!(0, _pundleApi.shouldProcess)(context.config.rootDirectory, file.filePath, config)) {
35 return null;
36 }
37
38 var chunks = [];
39 var imports = [];
40
41 var ast = void 0;
42 try {
43 ast = (0, _babylon.parse)(file.getContents(), {
44 sourceType: 'module',
45 sourceFilename: file.filePath,
46 plugins: ['jsx', 'flow', '*']
47 });
48 } catch (error) {
49 if (error.loc) {
50 throw new _pundleApi.FileIssue(file.getFilePath(), file.getContents(), error.loc.line, error.loc.column + 1, error.message, 'error');
51 } else {
52 throw new _pundleApi.FileMessageIssue(file.getFilePath(), error.message);
53 }
54 }
55
56 var processResolve = function processResolve(node) {
57 var request = context.getImportRequest(node.value, file.filePath, node.loc);
58 imports.push(request);
59 node.value = request.id.toString();
60 };
61 var processReplaceable = function processReplaceable(path) {
62 var name = Helpers.getName(path.node);
63 if ({}.hasOwnProperty.call(context.config.replaceVariables, name)) {
64 path.replaceWith(Helpers.getParsedReplacement(context.config.replaceVariables[name]));
65 }
66 };
67 (0, _babelTraverse2.default)(ast, {
68 ImportDeclaration: function ImportDeclaration(path) {
69 processResolve(path.node.source);
70 },
71 CallExpression: function CallExpression(path) {
72 if (path.node.callee.type === 'Import') {
73 Helpers.processImport(context, file, chunks, path);
74 return;
75 }
76 var name = Helpers.getName(path.node.callee);
77 if (!RESOLVE_NAMES.has(name)) {
78 return;
79 }
80 var parameter = path.node.arguments && path.node.arguments[0];
81 if (!parameter || parameter.type !== (name === 'require.ensure' ? 'ArrayExpression' : 'StringLiteral')) {
82 return;
83 }
84 if (RESOLVE_NAMES_SENSITIVE.has(name) && path.scope.hasBinding('require')) {
85 return;
86 }
87 if (name === 'require.ensure') {
88 Helpers.processEnsure(context, file, chunks, path);
89 } else {
90 processResolve(parameter);
91 }
92 },
93 Identifier: processReplaceable,
94 MemberExpression: processReplaceable
95 });
96
97 var compiled = (0, _babelGenerator2.default)(ast, {
98 quotes: 'single',
99 compact: true,
100 comments: false,
101 filename: file.filePath,
102 sourceMaps: true,
103 sourceFileName: file.filePath
104 });
105
106 return {
107 chunks: chunks,
108 imports: imports,
109 contents: compiled.code,
110 sourceMap: compiled.map
111 };
112 });
113
114 return function (_x, _x2, _x3) {
115 return _ref.apply(this, arguments);
116 };
117}(), {
118 extensions: ['js', 'jsx']
119});
\No newline at end of file