eslint-plugin-mdx
Version:
ESLint Plugin for MDX
86 lines • 2.82 kB
JavaScript
import path from 'path';
import { cosmiconfigSync } from 'cosmiconfig';
import { arrayify } from 'eslint-mdx';
import remarkMdx from 'remark-mdx';
import remarkParse from 'remark-parse';
import remarkStringify from 'remark-stringify';
import unified from 'unified';
export const requirePkg = (plugin, prefix, filePath) => {
if (filePath && /^\.\.?([/\\]|$)/.test(plugin)) {
plugin = path.resolve(path.dirname(filePath), plugin);
}
prefix = prefix.endsWith('-') ? prefix : prefix + '-';
const packages = [
plugin,
plugin.startsWith('@')
? plugin.replace('/', '/' + prefix)
: prefix + plugin,
];
let error;
for (const pkg of packages) {
try {
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires
return require(pkg);
}
catch (err) {
if (!error) {
error = err;
}
}
}
throw error;
};
let searchSync;
export const remarkProcessor = unified().use(remarkParse).freeze();
export const getRemarkProcessor = (searchFrom, isMdx) => {
if (!searchSync) {
searchSync = cosmiconfigSync('remark', {
packageProp: 'remarkConfig',
}).search;
}
let result;
try {
result = searchSync(searchFrom);
}
catch (err) {
// https://github.com/eslint/eslint/issues/11989
/* istanbul ignore if */
if (err.code !== 'ENOTDIR' ||
!/\d+_?\.[a-z]+$/.test(searchFrom)) {
throw err;
}
try {
result = searchSync(path.dirname(searchFrom));
}
catch (_a) {
/* istanbul ignore next */
throw err;
}
}
/* istanbul ignore next */
const { plugins = [], settings } = ((result === null || result === void 0 ? void 0 : result.config) ||
{});
try {
// disable this rule automatically since we already have a parser option `extensions`
// eslint-disable-next-line node/no-extraneous-require
plugins.push([require.resolve('remark-lint-file-extension'), false]);
}
catch (_b) {
// just ignore if the package does not exist
}
const initProcessor = remarkProcessor().use({ settings }).use(remarkStringify);
if (isMdx) {
initProcessor.use(remarkMdx);
}
return plugins
.reduce((processor, pluginWithSettings) => {
const [plugin, ...pluginSettings] = arrayify(pluginWithSettings);
return processor.use(
/* istanbul ignore next */
typeof plugin === 'string'
? requirePkg(plugin, 'remark', result.filepath)
: plugin, ...pluginSettings);
}, initProcessor)
.freeze();
};
//# sourceMappingURL=helpers.js.map