const _ = require('lodash'); const babelParser = require('@babel/parser'); const { log } = require('@jsdoc/util'); // Exported so we can use them in tests. const parserOptions = (exports.parserOptions = { allowAwaitOutsideFunction: true, allowImportExportEverywhere: true, allowReturnOutsideFunction: true, allowSuperOutsideMethod: true, allowUndeclaredExports: true, plugins: [ 'asyncGenerators', 'bigInt', 'classPrivateMethods', 'classPrivateProperties', 'classProperties', [ 'decorators', { decoratorsBeforeExport: true, }, ], 'doExpressions', 'dynamicImport', 'estree', 'exportDefaultFrom', 'exportNamespaceFrom', 'functionBind', 'functionSent', 'importMeta', 'jsx', 'logicalAssignment', 'nullishCoalescingOperator', 'numericSeparator', 'objectRestSpread', 'optionalCatchBinding', 'optionalChaining', [ 'pipelineOperator', { proposal: 'minimal', }, ], 'throwExpressions', ], ranges: true, }); function parse(source, filename, sourceType) { let ast; const options = _.defaults({}, parserOptions, { sourceType }); try { ast = babelParser.parse(source, options); } catch (e) { log.error(`Unable to parse ${filename}: ${e.message}`); } return ast; } // TODO: docs class AstBuilder { // TODO: docs static build(source, filename, sourceType) { return parse(source, filename, sourceType); } } exports.AstBuilder = AstBuilder;