UNPKG

3.54 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.run = run;
7
8function _traverse() {
9 const data = _interopRequireDefault(require("@babel/traverse"));
10
11 _traverse = function () {
12 return data;
13 };
14
15 return data;
16}
17
18var _pluginPass = _interopRequireDefault(require("./plugin-pass"));
19
20var _blockHoistPlugin = _interopRequireDefault(require("./block-hoist-plugin"));
21
22var _normalizeOpts = _interopRequireDefault(require("./normalize-opts"));
23
24var _normalizeFile = _interopRequireDefault(require("./normalize-file"));
25
26var _generate = _interopRequireDefault(require("./file/generate"));
27
28function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
30function* run(config, code, ast) {
31 const file = yield* (0, _normalizeFile.default)(config.passes, (0, _normalizeOpts.default)(config), code, ast);
32 const opts = file.opts;
33
34 try {
35 yield* transformFile(file, config.passes);
36 } catch (e) {
37 var _opts$filename;
38
39 e.message = `${(_opts$filename = opts.filename) != null ? _opts$filename : "unknown"}: ${e.message}`;
40
41 if (!e.code) {
42 e.code = "BABEL_TRANSFORM_ERROR";
43 }
44
45 throw e;
46 }
47
48 let outputCode, outputMap;
49
50 try {
51 if (opts.code !== false) {
52 ({
53 outputCode,
54 outputMap
55 } = (0, _generate.default)(config.passes, file));
56 }
57 } catch (e) {
58 var _opts$filename2;
59
60 e.message = `${(_opts$filename2 = opts.filename) != null ? _opts$filename2 : "unknown"}: ${e.message}`;
61
62 if (!e.code) {
63 e.code = "BABEL_GENERATE_ERROR";
64 }
65
66 throw e;
67 }
68
69 return {
70 metadata: file.metadata,
71 options: opts,
72 ast: opts.ast === true ? file.ast : null,
73 code: outputCode === undefined ? null : outputCode,
74 map: outputMap === undefined ? null : outputMap,
75 sourceType: file.ast.program.sourceType
76 };
77}
78
79function* transformFile(file, pluginPasses) {
80 for (const pluginPairs of pluginPasses) {
81 const passPairs = [];
82 const passes = [];
83 const visitors = [];
84
85 for (const plugin of pluginPairs.concat([(0, _blockHoistPlugin.default)()])) {
86 const pass = new _pluginPass.default(file, plugin.key, plugin.options);
87 passPairs.push([plugin, pass]);
88 passes.push(pass);
89 visitors.push(plugin.visitor);
90 }
91
92 for (const [plugin, pass] of passPairs) {
93 const fn = plugin.pre;
94
95 if (fn) {
96 const result = fn.call(pass, file);
97 yield* [];
98
99 if (isThenable(result)) {
100 throw new Error(`You appear to be using an plugin with an async .pre, ` + `which your current version of Babel does not support. ` + `If you're using a published plugin, you may need to upgrade ` + `your @babel/core version.`);
101 }
102 }
103 }
104
105 const visitor = _traverse().default.visitors.merge(visitors, passes, file.opts.wrapPluginVisitorMethod);
106
107 (0, _traverse().default)(file.ast, visitor, file.scope);
108
109 for (const [plugin, pass] of passPairs) {
110 const fn = plugin.post;
111
112 if (fn) {
113 const result = fn.call(pass, file);
114 yield* [];
115
116 if (isThenable(result)) {
117 throw new Error(`You appear to be using an plugin with an async .post, ` + `which your current version of Babel does not support. ` + `If you're using a published plugin, you may need to upgrade ` + `your @babel/core version.`);
118 }
119 }
120 }
121 }
122}
123
124function isThenable(val) {
125 return !!val && (typeof val === "object" || typeof val === "function") && !!val.then && typeof val.then === "function";
126}
\No newline at end of file