| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.runAsync = runAsync; |
| exports.runSync = runSync; |
| |
| function _traverse() { |
| const data = _interopRequireDefault(require("@babel/traverse")); |
| |
| _traverse = function () { |
| return data; |
| }; |
| |
| return data; |
| } |
| |
| var _pluginPass = _interopRequireDefault(require("./plugin-pass")); |
| |
| var _blockHoistPlugin = _interopRequireDefault(require("./block-hoist-plugin")); |
| |
| var _normalizeOpts = _interopRequireDefault(require("./normalize-opts")); |
| |
| var _normalizeFile = _interopRequireDefault(require("./normalize-file")); |
| |
| var _generate = _interopRequireDefault(require("./file/generate")); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| function runAsync(config, code, ast, callback) { |
| let result; |
| |
| try { |
| result = runSync(config, code, ast); |
| } catch (err) { |
| return callback(err); |
| } |
| |
| return callback(null, result); |
| } |
| |
| function runSync(config, code, ast) { |
| const file = (0, _normalizeFile.default)(config.passes, (0, _normalizeOpts.default)(config), code, ast); |
| transformFile(file, config.passes); |
| const opts = file.opts; |
| const { |
| outputCode, |
| outputMap |
| } = opts.code !== false ? (0, _generate.default)(config.passes, file) : {}; |
| return { |
| metadata: file.metadata, |
| options: opts, |
| ast: opts.ast === true ? file.ast : null, |
| code: outputCode === undefined ? null : outputCode, |
| map: outputMap === undefined ? null : outputMap, |
| sourceType: file.ast.program.sourceType |
| }; |
| } |
| |
| function transformFile(file, pluginPasses) { |
| for (const pluginPairs of pluginPasses) { |
| const passPairs = []; |
| const passes = []; |
| const visitors = []; |
| |
| for (const plugin of pluginPairs.concat([(0, _blockHoistPlugin.default)()])) { |
| const pass = new _pluginPass.default(file, plugin.key, plugin.options); |
| passPairs.push([plugin, pass]); |
| passes.push(pass); |
| visitors.push(plugin.visitor); |
| } |
| |
| for (const [plugin, pass] of passPairs) { |
| const fn = plugin.pre; |
| |
| if (fn) { |
| const result = fn.call(pass, file); |
| |
| if (isThenable(result)) { |
| 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.`); |
| } |
| } |
| } |
| |
| const visitor = _traverse().default.visitors.merge(visitors, passes, file.opts.wrapPluginVisitorMethod); |
| |
| (0, _traverse().default)(file.ast, visitor, file.scope); |
| |
| for (const [plugin, pass] of passPairs) { |
| const fn = plugin.post; |
| |
| if (fn) { |
| const result = fn.call(pass, file); |
| |
| if (isThenable(result)) { |
| 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.`); |
| } |
| } |
| } |
| } |
| } |
| |
| function isThenable(val) { |
| return !!val && (typeof val === "object" || typeof val === "function") && !!val.then && typeof val.then === "function"; |
| } |