mirror of
https://github.com/DavidAnson/markdownlint.git
synced 2025-09-22 05:40:48 +02:00
Allow a custom rule's onError implementation to override that rule's information URL for each error.
This commit is contained in:
parent
14974e52a9
commit
c699b8e22b
7 changed files with 235 additions and 18 deletions
|
@ -115,7 +115,12 @@ module.exports.isEmptyString = function isEmptyString(str) {
|
||||||
|
|
||||||
// Returns true iff the input is an object
|
// Returns true iff the input is an object
|
||||||
module.exports.isObject = function isObject(obj) {
|
module.exports.isObject = function isObject(obj) {
|
||||||
return obj !== null && _typeof(obj) === "object" && !Array.isArray(obj);
|
return !!obj && _typeof(obj) === "object" && !Array.isArray(obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Returns true iff the input is a URL
|
||||||
|
module.exports.isUrl = function isUrl(obj) {
|
||||||
|
return !!obj && Object.getPrototypeOf(obj) === URL.prototype;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1712,7 +1717,7 @@ function validateRuleList(ruleList, synchronous) {
|
||||||
result = newError(_property);
|
result = newError(_property);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!result && rule.information && Object.getPrototypeOf(rule.information) !== URL.prototype) {
|
if (!result && rule.information && !helpers.isUrl(rule.information)) {
|
||||||
result = newError("information");
|
result = newError("information");
|
||||||
}
|
}
|
||||||
if (!result && rule.asynchronous !== undefined && typeof rule.asynchronous !== "boolean") {
|
if (!result && rule.asynchronous !== undefined && typeof rule.asynchronous !== "boolean") {
|
||||||
|
@ -2401,6 +2406,9 @@ function lintContent(ruleList, aliasToRuleNames, name, content, md, config, conf
|
||||||
if (errorInfo.context && !helpers.isString(errorInfo.context)) {
|
if (errorInfo.context && !helpers.isString(errorInfo.context)) {
|
||||||
throwError("context");
|
throwError("context");
|
||||||
}
|
}
|
||||||
|
if (errorInfo.information && !helpers.isUrl(errorInfo.information)) {
|
||||||
|
throwError("information");
|
||||||
|
}
|
||||||
if (errorInfo.range && (!Array.isArray(errorInfo.range) || errorInfo.range.length !== 2 || !helpers.isNumber(errorInfo.range[0]) || errorInfo.range[0] < 1 || !helpers.isNumber(errorInfo.range[1]) || errorInfo.range[1] < 1 || errorInfo.range[0] + errorInfo.range[1] - 1 > lines[errorInfo.lineNumber - 1].length)) {
|
if (errorInfo.range && (!Array.isArray(errorInfo.range) || errorInfo.range.length !== 2 || !helpers.isNumber(errorInfo.range[0]) || errorInfo.range[0] < 1 || !helpers.isNumber(errorInfo.range[1]) || errorInfo.range[1] < 1 || errorInfo.range[0] + errorInfo.range[1] - 1 > lines[errorInfo.lineNumber - 1].length)) {
|
||||||
throwError("range");
|
throwError("range");
|
||||||
}
|
}
|
||||||
|
@ -2436,12 +2444,13 @@ function lintContent(ruleList, aliasToRuleNames, name, content, md, config, conf
|
||||||
cleanFixInfo.insertText = fixInfo.insertText;
|
cleanFixInfo.insertText = fixInfo.insertText;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
var information = errorInfo.information || rule.information;
|
||||||
results.push({
|
results.push({
|
||||||
lineNumber: lineNumber,
|
lineNumber: lineNumber,
|
||||||
"ruleName": rule.names[0],
|
"ruleName": rule.names[0],
|
||||||
"ruleNames": rule.names,
|
"ruleNames": rule.names,
|
||||||
"ruleDescription": rule.description,
|
"ruleDescription": rule.description,
|
||||||
"ruleInformation": rule.information ? rule.information.href : null,
|
"ruleInformation": information ? information.href : null,
|
||||||
"errorDetail": errorInfo.detail || null,
|
"errorDetail": errorInfo.detail || null,
|
||||||
"errorContext": errorInfo.context || null,
|
"errorContext": errorInfo.context || null,
|
||||||
"errorRange": errorInfo.range ? _toConsumableArray(errorInfo.range) : null,
|
"errorRange": errorInfo.range ? _toConsumableArray(errorInfo.range) : null,
|
||||||
|
@ -3036,6 +3045,7 @@ module.exports = markdownlint;
|
||||||
* @property {number} lineNumber Line number (1-based).
|
* @property {number} lineNumber Line number (1-based).
|
||||||
* @property {string} [detail] Detail about the error.
|
* @property {string} [detail] Detail about the error.
|
||||||
* @property {string} [context] Context for the error.
|
* @property {string} [context] Context for the error.
|
||||||
|
* @property {URL} [information] Link to more information.
|
||||||
* @property {number[]} [range] Column number (1-based) and length.
|
* @property {number[]} [range] Column number (1-based) and length.
|
||||||
* @property {RuleOnErrorFixInfo} [fixInfo] Fix information.
|
* @property {RuleOnErrorFixInfo} [fixInfo] Fix information.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -82,6 +82,8 @@ properties:
|
||||||
error.
|
error.
|
||||||
- `context` is an optional `String` with relevant text surrounding the error
|
- `context` is an optional `String` with relevant text surrounding the error
|
||||||
location.
|
location.
|
||||||
|
- `information` is an optional (absolute) `URL` of a link to override the
|
||||||
|
same-named value provided by the rule definition. (Uncommon)
|
||||||
- `range` is an optional `Array` with two `Number` values identifying the
|
- `range` is an optional `Array` with two `Number` values identifying the
|
||||||
1-based column and length of the error.
|
1-based column and length of the error.
|
||||||
- `fixInfo` is an optional `Object` with information about how to fix the
|
- `fixInfo` is an optional `Object` with information about how to fix the
|
||||||
|
|
|
@ -112,7 +112,7 @@ markdownlint(options, assertLintResultsCallback);
|
||||||
const testRule = {
|
const testRule = {
|
||||||
"names": [ "test-rule" ],
|
"names": [ "test-rule" ],
|
||||||
"description": "Test rule",
|
"description": "Test rule",
|
||||||
"information": new URL("https://example.com/test-rule"),
|
"information": new URL("https://example.com/rule-information"),
|
||||||
"tags": [ "test-tag" ],
|
"tags": [ "test-tag" ],
|
||||||
"function": function rule(params: markdownlint.RuleParams, onError: markdownlint.RuleOnError) {
|
"function": function rule(params: markdownlint.RuleParams, onError: markdownlint.RuleOnError) {
|
||||||
assert(!!params);
|
assert(!!params);
|
||||||
|
@ -136,6 +136,7 @@ const testRule = {
|
||||||
"lineNumber": 1,
|
"lineNumber": 1,
|
||||||
"detail": "detail",
|
"detail": "detail",
|
||||||
"context": "context",
|
"context": "context",
|
||||||
|
"information": new URL("https://example.com/error-information"),
|
||||||
"range": [ 1, 2 ],
|
"range": [ 1, 2 ],
|
||||||
"fixInfo": {
|
"fixInfo": {
|
||||||
"lineNumber": 1,
|
"lineNumber": 1,
|
||||||
|
|
|
@ -73,7 +73,12 @@ module.exports.isEmptyString = function isEmptyString(str) {
|
||||||
|
|
||||||
// Returns true iff the input is an object
|
// Returns true iff the input is an object
|
||||||
module.exports.isObject = function isObject(obj) {
|
module.exports.isObject = function isObject(obj) {
|
||||||
return (obj !== null) && (typeof obj === "object") && !Array.isArray(obj);
|
return !!obj && (typeof obj === "object") && !Array.isArray(obj);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Returns true iff the input is a URL
|
||||||
|
module.exports.isUrl = function isUrl(obj) {
|
||||||
|
return !!obj && (Object.getPrototypeOf(obj) === URL.prototype);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
4
lib/markdownlint.d.ts
vendored
4
lib/markdownlint.d.ts
vendored
|
@ -218,6 +218,10 @@ type RuleOnErrorInfo = {
|
||||||
* Context for the error.
|
* Context for the error.
|
||||||
*/
|
*/
|
||||||
context?: string;
|
context?: string;
|
||||||
|
/**
|
||||||
|
* Link to more information.
|
||||||
|
*/
|
||||||
|
information?: URL;
|
||||||
/**
|
/**
|
||||||
* Column number (1-based) and length.
|
* Column number (1-based) and length.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -59,7 +59,7 @@ function validateRuleList(ruleList, synchronous) {
|
||||||
if (
|
if (
|
||||||
!result &&
|
!result &&
|
||||||
rule.information &&
|
rule.information &&
|
||||||
(Object.getPrototypeOf(rule.information) !== URL.prototype)
|
!helpers.isUrl(rule.information)
|
||||||
) {
|
) {
|
||||||
result = newError("information");
|
result = newError("information");
|
||||||
}
|
}
|
||||||
|
@ -629,6 +629,10 @@ function lintContent(
|
||||||
!helpers.isString(errorInfo.context)) {
|
!helpers.isString(errorInfo.context)) {
|
||||||
throwError("context");
|
throwError("context");
|
||||||
}
|
}
|
||||||
|
if (errorInfo.information &&
|
||||||
|
!helpers.isUrl(errorInfo.information)) {
|
||||||
|
throwError("information");
|
||||||
|
}
|
||||||
if (errorInfo.range &&
|
if (errorInfo.range &&
|
||||||
(!Array.isArray(errorInfo.range) ||
|
(!Array.isArray(errorInfo.range) ||
|
||||||
(errorInfo.range.length !== 2) ||
|
(errorInfo.range.length !== 2) ||
|
||||||
|
@ -681,12 +685,13 @@ function lintContent(
|
||||||
cleanFixInfo.insertText = fixInfo.insertText;
|
cleanFixInfo.insertText = fixInfo.insertText;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const information = errorInfo.information || rule.information;
|
||||||
results.push({
|
results.push({
|
||||||
lineNumber,
|
lineNumber,
|
||||||
"ruleName": rule.names[0],
|
"ruleName": rule.names[0],
|
||||||
"ruleNames": rule.names,
|
"ruleNames": rule.names,
|
||||||
"ruleDescription": rule.description,
|
"ruleDescription": rule.description,
|
||||||
"ruleInformation": rule.information ? rule.information.href : null,
|
"ruleInformation": information ? information.href : null,
|
||||||
"errorDetail": errorInfo.detail || null,
|
"errorDetail": errorInfo.detail || null,
|
||||||
"errorContext": errorInfo.context || null,
|
"errorContext": errorInfo.context || null,
|
||||||
"errorRange": errorInfo.range ? [ ...errorInfo.range ] : null,
|
"errorRange": errorInfo.range ? [ ...errorInfo.range ] : null,
|
||||||
|
@ -1314,6 +1319,7 @@ module.exports = markdownlint;
|
||||||
* @property {number} lineNumber Line number (1-based).
|
* @property {number} lineNumber Line number (1-based).
|
||||||
* @property {string} [detail] Detail about the error.
|
* @property {string} [detail] Detail about the error.
|
||||||
* @property {string} [context] Context for the error.
|
* @property {string} [context] Context for the error.
|
||||||
|
* @property {URL} [information] Link to more information.
|
||||||
* @property {number[]} [range] Column number (1-based) and length.
|
* @property {number[]} [range] Column number (1-based) and length.
|
||||||
* @property {RuleOnErrorFixInfo} [fixInfo] Fix information.
|
* @property {RuleOnErrorFixInfo} [fixInfo] Fix information.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -648,31 +648,30 @@ test("customRulesOnErrorNullSync", (t) => {
|
||||||
});
|
});
|
||||||
|
|
||||||
test("customRulesOnErrorBad", (t) => {
|
test("customRulesOnErrorBad", (t) => {
|
||||||
t.plan(21);
|
t.plan(25);
|
||||||
for (const testCase of [
|
for (const testCase of [
|
||||||
{
|
{
|
||||||
"propertyName": "lineNumber",
|
"propertyName": "lineNumber",
|
||||||
"subPropertyName": null,
|
|
||||||
"propertyValues": [ null, "string" ]
|
"propertyValues": [ null, "string" ]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"propertyName": "detail",
|
"propertyName": "detail",
|
||||||
"subPropertyName": null,
|
|
||||||
"propertyValues": [ 10, [] ]
|
"propertyValues": [ 10, [] ]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"propertyName": "context",
|
"propertyName": "context",
|
||||||
"subPropertyName": null,
|
|
||||||
"propertyValues": [ 10, [] ]
|
"propertyValues": [ 10, [] ]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"propertyName": "information",
|
||||||
|
"propertyValues": [ 10, [], "string", "https://example.com" ]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"propertyName": "range",
|
"propertyName": "range",
|
||||||
"subPropertyName": null,
|
|
||||||
"propertyValues": [ 10, [], [ 10 ], [ 10, null ], [ 10, 11, 12 ] ]
|
"propertyValues": [ 10, [], [ 10 ], [ 10, null ], [ 10, 11, 12 ] ]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"propertyName": "fixInfo",
|
"propertyName": "fixInfo",
|
||||||
"subPropertyName": null,
|
|
||||||
"propertyValues": [ 10, "string" ]
|
"propertyValues": [ 10, "string" ]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -744,12 +743,10 @@ test("customRulesOnErrorInvalid", (t) => {
|
||||||
for (const testCase of [
|
for (const testCase of [
|
||||||
{
|
{
|
||||||
"propertyName": "lineNumber",
|
"propertyName": "lineNumber",
|
||||||
"subPropertyName": null,
|
|
||||||
"propertyValues": [ -1, 0, 3, 4 ]
|
"propertyValues": [ -1, 0, 3, 4 ]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"propertyName": "range",
|
"propertyName": "range",
|
||||||
"subPropertyName": null,
|
|
||||||
"propertyValues": [ [ 0, 1 ], [ 1, 0 ], [ 5, 1 ], [ 1, 5 ], [ 4, 2 ] ]
|
"propertyValues": [ [ 0, 1 ], [ 1, 0 ], [ 5, 1 ], [ 1, 5 ], [ 4, 2 ] ]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -816,12 +813,10 @@ test("customRulesOnErrorValid", (t) => {
|
||||||
for (const testCase of [
|
for (const testCase of [
|
||||||
{
|
{
|
||||||
"propertyName": "lineNumber",
|
"propertyName": "lineNumber",
|
||||||
"subPropertyName": null,
|
|
||||||
"propertyValues": [ 1, 2 ]
|
"propertyValues": [ 1, 2 ]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"propertyName": "range",
|
"propertyName": "range",
|
||||||
"subPropertyName": null,
|
|
||||||
"propertyValues": [ [ 1, 1 ], [ 1, 4 ], [ 2, 2 ], [ 3, 2 ], [ 4, 1 ] ]
|
"propertyValues": [ [ 1, 1 ], [ 1, 4 ], [ 2, 2 ], [ 3, 2 ], [ 4, 1 ] ]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -927,6 +922,7 @@ test("customRulesOnErrorModified", (t) => new Promise((resolve) => {
|
||||||
"lineNumber": 1,
|
"lineNumber": 1,
|
||||||
"detail": "detail",
|
"detail": "detail",
|
||||||
"context": "context",
|
"context": "context",
|
||||||
|
"information": new URL("https://example.com/information"),
|
||||||
"range": [ 1, 2 ],
|
"range": [ 1, 2 ],
|
||||||
"fixInfo": {
|
"fixInfo": {
|
||||||
"editColumn": 1,
|
"editColumn": 1,
|
||||||
|
@ -945,6 +941,7 @@ test("customRulesOnErrorModified", (t) => new Promise((resolve) => {
|
||||||
errorObject.lineNumber = 2;
|
errorObject.lineNumber = 2;
|
||||||
errorObject.detail = "changed";
|
errorObject.detail = "changed";
|
||||||
errorObject.context = "changed";
|
errorObject.context = "changed";
|
||||||
|
errorObject.information = new URL("https://example.com/changed");
|
||||||
errorObject.range[1] = 3;
|
errorObject.range[1] = 3;
|
||||||
errorObject.fixInfo.editColumn = 2;
|
errorObject.fixInfo.editColumn = 2;
|
||||||
errorObject.fixInfo.deleteCount = 3;
|
errorObject.fixInfo.deleteCount = 3;
|
||||||
|
@ -964,7 +961,7 @@ test("customRulesOnErrorModified", (t) => new Promise((resolve) => {
|
||||||
"lineNumber": 1,
|
"lineNumber": 1,
|
||||||
"ruleNames": [ "name" ],
|
"ruleNames": [ "name" ],
|
||||||
"ruleDescription": "description",
|
"ruleDescription": "description",
|
||||||
"ruleInformation": null,
|
"ruleInformation": "https://example.com/information",
|
||||||
"errorDetail": "detail",
|
"errorDetail": "detail",
|
||||||
"errorContext": "context",
|
"errorContext": "context",
|
||||||
"errorRange": [ 1, 2 ],
|
"errorRange": [ 1, 2 ],
|
||||||
|
@ -1105,6 +1102,198 @@ test("customRulesStringName", (t) => new Promise((resolve) => {
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
test("customRulesOnErrorInformationNotRuleNotError", (t) => {
|
||||||
|
t.plan(1);
|
||||||
|
const actualResult = markdownlint.sync({
|
||||||
|
"customRules": [
|
||||||
|
{
|
||||||
|
"names": [ "name" ],
|
||||||
|
"description": "description",
|
||||||
|
"tags": [ "tag" ],
|
||||||
|
"function": (params, onError) => {
|
||||||
|
onError({
|
||||||
|
"lineNumber": 1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"strings": {
|
||||||
|
"string": "# Heading\n"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
t.true(actualResult.string[0].ruleInformation === null, "Unexpected URL.");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("customRulesOnErrorInformationRuleNotError", (t) => {
|
||||||
|
t.plan(1);
|
||||||
|
const actualResult = markdownlint.sync({
|
||||||
|
"customRules": [
|
||||||
|
{
|
||||||
|
"names": [ "name" ],
|
||||||
|
"description": "description",
|
||||||
|
"tags": [ "tag" ],
|
||||||
|
"information": new URL("https://example.com/rule"),
|
||||||
|
"function": (params, onError) => {
|
||||||
|
onError({
|
||||||
|
"lineNumber": 1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"strings": {
|
||||||
|
"string": "# Heading\n"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
t.is(
|
||||||
|
actualResult.string[0].ruleInformation,
|
||||||
|
"https://example.com/rule",
|
||||||
|
"Unexpected URL."
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("customRulesOnErrorInformationNotRuleError", (t) => {
|
||||||
|
t.plan(1);
|
||||||
|
const actualResult = markdownlint.sync({
|
||||||
|
"customRules": [
|
||||||
|
{
|
||||||
|
"names": [ "name" ],
|
||||||
|
"description": "description",
|
||||||
|
"tags": [ "tag" ],
|
||||||
|
"function": (params, onError) => {
|
||||||
|
onError({
|
||||||
|
"lineNumber": 1,
|
||||||
|
"information": new URL("https://example.com/error")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"strings": {
|
||||||
|
"string": "# Heading\n"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
t.is(
|
||||||
|
actualResult.string[0].ruleInformation,
|
||||||
|
"https://example.com/error",
|
||||||
|
"Unexpected URL."
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("customRulesOnErrorInformationRuleError", (t) => {
|
||||||
|
t.plan(1);
|
||||||
|
const actualResult = markdownlint.sync({
|
||||||
|
"customRules": [
|
||||||
|
{
|
||||||
|
"names": [ "name" ],
|
||||||
|
"description": "description",
|
||||||
|
"tags": [ "tag" ],
|
||||||
|
"information": new URL("https://example.com/rule"),
|
||||||
|
"function": (params, onError) => {
|
||||||
|
onError({
|
||||||
|
"lineNumber": 1,
|
||||||
|
"information": new URL("https://example.com/error")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"strings": {
|
||||||
|
"string": "# Heading\n"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
t.is(
|
||||||
|
actualResult.string[0].ruleInformation,
|
||||||
|
"https://example.com/error",
|
||||||
|
"Unexpected URL."
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("customRulesOnErrorInformationRuleErrorUndefined", (t) => {
|
||||||
|
t.plan(1);
|
||||||
|
const actualResult = markdownlint.sync({
|
||||||
|
"customRules": [
|
||||||
|
{
|
||||||
|
"names": [ "name" ],
|
||||||
|
"description": "description",
|
||||||
|
"tags": [ "tag" ],
|
||||||
|
"information": new URL("https://example.com/rule"),
|
||||||
|
"function": (params, onError) => {
|
||||||
|
onError({
|
||||||
|
"lineNumber": 1,
|
||||||
|
"information": undefined
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"strings": {
|
||||||
|
"string": "# Heading\n"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
t.is(
|
||||||
|
actualResult.string[0].ruleInformation,
|
||||||
|
"https://example.com/rule",
|
||||||
|
"Unexpected URL."
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("customRulesOnErrorInformationRuleErrorMultiple", (t) => {
|
||||||
|
t.plan(6);
|
||||||
|
const actualResult = markdownlint.sync({
|
||||||
|
"customRules": [
|
||||||
|
{
|
||||||
|
"names": [ "name" ],
|
||||||
|
"description": "description",
|
||||||
|
"tags": [ "tag" ],
|
||||||
|
"information": new URL("https://example.com/rule"),
|
||||||
|
"function": (params, onError) => {
|
||||||
|
onError({
|
||||||
|
"lineNumber": 1,
|
||||||
|
"information": new URL("https://example.com/errorA")
|
||||||
|
});
|
||||||
|
onError({
|
||||||
|
"lineNumber": 3,
|
||||||
|
"information": new URL("https://example.com/errorB")
|
||||||
|
});
|
||||||
|
onError({
|
||||||
|
"lineNumber": 5
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"strings": {
|
||||||
|
"string": "# Heading\n\nText\n\nText\n"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
t.is(
|
||||||
|
actualResult.string[0].lineNumber,
|
||||||
|
1,
|
||||||
|
"Unexpected line number."
|
||||||
|
);
|
||||||
|
t.is(
|
||||||
|
actualResult.string[0].ruleInformation,
|
||||||
|
"https://example.com/errorA",
|
||||||
|
"Unexpected URL."
|
||||||
|
);
|
||||||
|
t.is(
|
||||||
|
actualResult.string[1].lineNumber,
|
||||||
|
3,
|
||||||
|
"Unexpected line number."
|
||||||
|
);
|
||||||
|
t.is(
|
||||||
|
actualResult.string[1].ruleInformation,
|
||||||
|
"https://example.com/errorB",
|
||||||
|
"Unexpected URL."
|
||||||
|
);
|
||||||
|
t.is(
|
||||||
|
actualResult.string[2].lineNumber,
|
||||||
|
5,
|
||||||
|
"Unexpected line number."
|
||||||
|
);
|
||||||
|
t.is(
|
||||||
|
actualResult.string[2].ruleInformation,
|
||||||
|
"https://example.com/rule",
|
||||||
|
"Unexpected URL."
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
test("customRulesDoc", (t) => new Promise((resolve) => {
|
test("customRulesDoc", (t) => new Promise((resolve) => {
|
||||||
t.plan(2);
|
t.plan(2);
|
||||||
markdownlint({
|
markdownlint({
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue