eslint-mdx
Version:
ESLint Parser for MDX
63 lines • 2.26 kB
JavaScript
import path from 'node:path';
import { arrayify, normalizePosition, getPhysicalFilename } from './helpers.js';
import { performSyncWork } from './sync.js';
export const DEFAULT_EXTENSIONS = ['.mdx'];
export const MARKDOWN_EXTENSIONS = ['.md'];
export class Parser {
constructor() {
this.parse = this.parse.bind(this);
this.parseForESLint = this.parseForESLint.bind(this);
}
parse(code, options) {
return this.parseForESLint(code, options).ast;
}
parseForESLint(code, { filePath, sourceType, ignoreRemarkConfig, remarkConfigPath, extensions, markdownExtensions, }) {
const extname = path.extname(filePath);
const isMdx = [...DEFAULT_EXTENSIONS, ...arrayify(extensions)].includes(extname);
const isMarkdown = [
...MARKDOWN_EXTENSIONS,
...arrayify(markdownExtensions),
].includes(extname);
if (!isMdx && !isMarkdown) {
throw new Error('Unsupported file extension, make sure setting the `extensions` or `markdownExtensions` option correctly.');
}
let result;
try {
result = performSyncWork({
filePath: getPhysicalFilename(filePath),
code,
isMdx,
ignoreRemarkConfig,
remarkConfigPath,
});
}
catch (err) {
if (process.argv.includes('--debug')) {
console.error(err);
}
const { message, line, column, place } = err;
const point = place && ('start' in place ? place.start : place);
throw Object.assign(new SyntaxError(message, {
cause: err,
}), {
lineNumber: line,
column,
index: point?.offset,
});
}
const { root, body, comments, tokens } = result;
return {
ast: {
...normalizePosition(root.position),
type: 'Program',
sourceType,
body,
comments,
tokens,
},
};
}
}
export const parser = new Parser();
export const { parse, parseForESLint } = parser;
//# sourceMappingURL=parser.js.map