Files

79 lines
2.0 KiB
JavaScript

import { Linter } from "eslint";
import unpad from "dedent";
import { fileURLToPath } from "node:url";
import babelEslintParser from "@babel/eslint-parser";
import globals from "globals";
export default function verifyAndAssertMessages(
code,
rules = {},
expectedMessages = [],
sourceType,
overrideConfig,
) {
const linter = new Linter();
const languageOptions = {
globals: (overrideConfig && overrideConfig.globals) ?? {
...globals.node,
...globals.es2024,
},
parser: babelEslintParser,
parserOptions: {
sourceType,
requireConfigFile: false,
...(overrideConfig && overrideConfig.parserOptions),
babelOptions: {
configFile: fileURLToPath(
new URL(
"../../../babel-eslint-shared-fixtures/config/babel.config.js",
import.meta.url,
),
),
...(overrideConfig &&
overrideConfig.parserOptions &&
overrideConfig.parserOptions.babelOptions),
},
},
};
const messages = linter.verify(unpad(`${code}`), {
languageOptions,
rules,
});
if (messages.length !== expectedMessages.length) {
throw new Error(
`Expected ${expectedMessages.length} message(s), got ${
messages.length
}\n${JSON.stringify(messages, null, 2)}`,
);
}
messages.forEach((message, i) => {
const formattedMessage = `${message.line}:${message.column} ${
message.message
}${message.ruleId ? ` ${message.ruleId}` : ""}`;
const expectedMessage = expectedMessages[i];
if (expectedMessage instanceof RegExp) {
if (!expectedMessage.test(formattedMessage)) {
throw new Error(
`
Message ${i} does not pass RegExp test:
Test: ${expectedMessage}
Actual: ${formattedMessage}
`,
);
}
} else if (formattedMessage !== expectedMessage) {
throw new Error(
`
Message ${i} does not match:
Expected: ${expectedMessage}
Actual: ${formattedMessage}
`,
);
}
});
}