jsdoc/packages/jsdoc-parse/lib/ast-builder.js
2021-09-19 13:20:31 -07:00

71 lines
1.5 KiB
JavaScript

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;