Add test case for custom rule that imports an ESM module (refs #477).

This commit is contained in:
David Anson 2022-01-11 23:08:53 -08:00
parent b1aef98220
commit 23d8ed7c01
5 changed files with 87 additions and 2 deletions

View file

@ -1143,6 +1143,32 @@ test.cb("customRulesLintJavaScript", (t) => {
}); });
}); });
test.cb("customRulesValidateJson", (t) => {
t.plan(2);
const options = {
"customRules": customRules.validateJson,
"files": "test/validate-json.md"
};
markdownlint(options, (err, actual) => {
t.falsy(err);
const expected = {
"test/validate-json.md": [
{
"lineNumber": 22,
"ruleNames": [ "validate-json" ],
"ruleDescription": "Rule that validates JSON code",
"ruleInformation": null,
"errorDetail": "Unexpected end of JSON input",
"errorContext": null,
"errorRange": null
}
]
};
t.deepEqual(actual, expected, "Unexpected issues.");
t.end();
});
});
test("customRulesAsyncThrowsInSyncContext", (t) => { test("customRulesAsyncThrowsInSyncContext", (t) => {
t.plan(1); t.plan(1);
const options = { const options = {

View file

@ -1109,7 +1109,7 @@ test("allBuiltInRulesHaveValidUrl", (t) => {
}); });
test("someCustomRulesHaveValidUrl", (t) => { test("someCustomRulesHaveValidUrl", (t) => {
t.plan(7); t.plan(8);
customRules.all.forEach(function forRule(rule) { customRules.all.forEach(function forRule(rule) {
t.true(!rule.information || t.true(!rule.information ||
(Object.getPrototypeOf(rule.information) === URL.prototype)); (Object.getPrototypeOf(rule.information) === URL.prototype));

View file

@ -17,10 +17,14 @@ module.exports.lettersEX = lettersEX;
const lintJavaScript = require("./lint-javascript"); const lintJavaScript = require("./lint-javascript");
module.exports.lintJavaScript = lintJavaScript; module.exports.lintJavaScript = lintJavaScript;
const validateJson = require("./validate-json");
module.exports.validateJson = validateJson;
module.exports.all = [ module.exports.all = [
anyBlockquote, anyBlockquote,
everyNLines, everyNLines,
firstLine, firstLine,
lettersEX, lettersEX,
lintJavaScript lintJavaScript,
validateJson
]; ];

View file

@ -0,0 +1,28 @@
// @ts-check
"use strict";
const { filterTokens } = require("markdownlint-rule-helpers");
module.exports = {
"names": [ "validate-json" ],
"description": "Rule that validates JSON code",
"tags": [ "test", "validate", "json" ],
"asynchronous": true,
"function": async(params, onError) => {
// eslint-disable-next-line max-len, node/no-unsupported-features/es-syntax
const { "default": stripJsonComments } = await import("strip-json-comments");
filterTokens(params, "fence", (fence) => {
if (/jsonc?/i.test(fence.info)) {
try {
JSON.parse(stripJsonComments(fence.content));
} catch (error) {
onError({
"lineNumber": fence.lineNumber,
"detail": error.message
});
}
}
});
}
};

27
test/validate-json.md Normal file
View file

@ -0,0 +1,27 @@
# Validate JSON
Text
```json
{
"property": "value"
}
```
Text
```jsonc
{
// Comment
"property": "value"
}
```
Text
```json
{
"property": "value"
```
Text