@typhonjs/babel-parser
Version:
Provides a front end for Javascript / Typescript AST generation by Babel parser with TyphonJS plugin support.
129 lines (98 loc) • 5.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof2 = require('babel-runtime/helpers/typeof');
var _typeof3 = _interopRequireDefault(_typeof2);
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
exports.onPluginLoad = onPluginLoad;
var _parser = require('@babel/parser');
var babelParser = _interopRequireWildcard(_parser);
function _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; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Default babel parser options applying most available plugins.
*
* Caveats include:
* - that both decorators and decorators-legacy can not be used simultaneously.
* - that both 'flow' and 'typescript' can not be used simultaneously
*
* @type {{plugins: string[]}}
* @ignore
*/
var s_DEFAULT_BABELPARSER_OPTIONS = {
plugins: ['asyncGenerators', 'bigInt', 'classProperties', 'classPrivateProperties', 'classPrivateMethods', ['decorators', { decoratorsBeforeExport: false }], 'doExpressions', 'dynamicImport', 'exportDefaultFrom', 'exportNamespaceFrom', 'functionBind', 'functionSent', 'importMeta', 'jsx', 'logicalAssignment', 'nullishCoalescingOperator', 'numericSeparator', 'objectRestSpread', 'optionalCatchBinding', 'optionalChaining', ['pipelineOperator', { proposal: 'minimal' }], 'throwExpressions', 'typescript']
};
/**
* Provides a convenience wrapper around Babel parser.
*/
var BabelParser = function () {
function BabelParser() {
(0, _classCallCheck3.default)(this, BabelParser);
}
(0, _createClass3.default)(BabelParser, null, [{
key: 'parse',
/**
* Parses the given source with Babel parser.
*
* @param {string} source - Javascript source code to parse.
* @param {object} [options] - Overrides default babel parser options.
* @param {object} [override] - Provides helper directives to override options to simplify modification of default
* Babel parser options.
*
* @returns {object}
*/
value: function parse(source) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : void 0;
var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : void 0;
// Make a copy of the default options.
var defaultOptions = JSON.parse((0, _stringify2.default)(s_DEFAULT_BABELPARSER_OPTIONS));
if ((typeof override === 'undefined' ? 'undefined' : (0, _typeof3.default)(override)) === 'object') {
// If decoratorsBeforeExport is defined as an override then set that value.
if (typeof override.decoratorsBeforeExport === 'boolean') {
defaultOptions.plugins[5][1].decoratorsBeforeExport = override.decoratorsBeforeExport;
}
// If decoratorsLegacy is enabled as an override then the actual implementation is swapped for
// decorators-legacy.
if (typeof override.decoratorsLegacy === 'boolean' && override.decoratorsLegacy) {
defaultOptions.plugins[5] = 'decorators-legacy';
}
// If pipelineOperatorProposal is defined as an override then set that value.
if (typeof override.pipelineOperatorProposal === 'string') {
defaultOptions.plugins[20][1].proposal = override.pipelineOperatorProposal;
}
// If flow is enabled as an override 'typescript' must be removed and 'flow' added.
if (typeof override.flow === 'boolean' && override.flow) {
var index = defaultOptions.plugins.indexOf('typescript');
if (index > -1) {
defaultOptions.plugins.splice(index, 1);
}
defaultOptions.plugins.push('flow');
}
}
options = (typeof options === 'undefined' ? 'undefined' : (0, _typeof3.default)(options)) === 'object' ? options : defaultOptions;
options.sourceType = typeof options.sourceType === 'string' ? options.sourceType : 'unambiguous';
return babelParser.parse(source, options);
}
}]);
return BabelParser;
}();
/**
* Wires up BabelParser on the plugin eventbus. The following event bindings are available:
*
* `typhonjs:babel:parser:file:parse`: Invokes `parseFile`.
* `typhonjs:babel:parser:source:parse`: Invokes `parseSource`.
*
* @param {PluginEvent} ev - The plugin event.
* @ignore
*/
exports.default = BabelParser;
function onPluginLoad(ev) {
var eventbus = ev.eventbus;
eventbus.on('typhonjs:babel:parser:parse', BabelParser.parse, BabelParser);
}