Skip to content

Commit

Permalink
Stop sharing params object across rules because doing so is unstable …
Browse files Browse the repository at this point in the history
…for asynchronous rules (fixes #510).
  • Loading branch information
DavidAnson committed Mar 20, 2022
1 parent 4affefc commit 62f5c85
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 20 deletions.
20 changes: 10 additions & 10 deletions demo/markdownlint-browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -1498,22 +1498,22 @@ function lintContent(ruleList, name, content, md, config, frontMatter, handleRul
var aliasToRuleNames = mapAliasToRuleNames(ruleList);
var _a = getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlineConfig, config, aliasToRuleNames), effectiveConfig = _a.effectiveConfig, enabledRulesPerLineNumber = _a.enabledRulesPerLineNumber;
// Create parameters for rules
var params = {
"name": helpers.deepFreeze(name),
"tokens": helpers.deepFreeze(tokens),
"lines": helpers.deepFreeze(lines),
"frontMatterLines": helpers.deepFreeze(frontMatterLines)
};
cache.lineMetadata(helpers.getLineMetadata(params));
cache.flattenedLists(helpers.flattenLists(params.tokens));
cache.codeBlockAndSpanRanges(helpers.codeBlockAndSpanRanges(params, cache.lineMetadata()));
var paramsBase = helpers.deepFreeze({
name: name,
tokens: tokens,
lines: lines,
frontMatterLines: frontMatterLines
});
cache.lineMetadata(helpers.getLineMetadata(paramsBase));
cache.flattenedLists(helpers.flattenLists(paramsBase.tokens));
cache.codeBlockAndSpanRanges(helpers.codeBlockAndSpanRanges(paramsBase, cache.lineMetadata()));
// Function to run for each rule
var results = [];
// eslint-disable-next-line jsdoc/require-jsdoc
function forRule(rule) {
// Configure rule
var ruleName = rule.names[0].toUpperCase();
params.config = effectiveConfig[ruleName];
var params = __assign(__assign({}, paramsBase), { "config": effectiveConfig[ruleName] });
// eslint-disable-next-line jsdoc/require-jsdoc
function throwError(property) {
throw new Error("Property '" + property + "' of onError parameter is incorrect.");
Expand Down
23 changes: 13 additions & 10 deletions lib/markdownlint.js
Original file line number Diff line number Diff line change
Expand Up @@ -489,24 +489,27 @@ function lintContent(
aliasToRuleNames
);
// Create parameters for rules
const params = {
"name": helpers.deepFreeze(name),
"tokens": helpers.deepFreeze(tokens),
"lines": helpers.deepFreeze(lines),
"frontMatterLines": helpers.deepFreeze(frontMatterLines)
};
cache.lineMetadata(helpers.getLineMetadata(params));
cache.flattenedLists(helpers.flattenLists(params.tokens));
const paramsBase = helpers.deepFreeze({
name,
tokens,
lines,
frontMatterLines
});
cache.lineMetadata(helpers.getLineMetadata(paramsBase));
cache.flattenedLists(helpers.flattenLists(paramsBase.tokens));
cache.codeBlockAndSpanRanges(
helpers.codeBlockAndSpanRanges(params, cache.lineMetadata())
helpers.codeBlockAndSpanRanges(paramsBase, cache.lineMetadata())
);
// Function to run for each rule
let results = [];
// eslint-disable-next-line jsdoc/require-jsdoc
function forRule(rule) {
// Configure rule
const ruleName = rule.names[0].toUpperCase();
params.config = effectiveConfig[ruleName];
const params = {
...paramsBase,
"config": effectiveConfig[ruleName]
};
// eslint-disable-next-line jsdoc/require-jsdoc
function throwError(property) {
throw new Error(
Expand Down
64 changes: 64 additions & 0 deletions test/markdownlint-test-custom-rules.js
Original file line number Diff line number Diff line change
Expand Up @@ -1195,6 +1195,70 @@ test("customRulesAsyncThrowsInSyncContext", (t) => {
);
});

test("customRulesParamsAreStable", (t) => {
t.plan(4);
const config1 = { "value1": 10 };
const config2 = { "value2": 20 };
const options = {
"config": {
"MD010": true,
"name1": config1,
"MD013": { "line_length": 200 },
"name2": config2,
"MD033": false
},
"customRules": [
{
"names": [ "name1" ],
"description": "description1",
"tags": [ "tag" ],
"asynchronous": true,
"function":
(params) => {
t.deepEqual(
params.config,
config1,
`Unexpected config in sync path: ${params.config}.`
);
return Promise.resolve().then(() => {
t.deepEqual(
params.config,
config1,
`Unexpected config in async path: ${params.config}.`
);
});
}
},
{
"names": [ "name2" ],
"description": "description2",
"tags": [ "tag" ],
"asynchronous": true,
"function":
(params) => {
const { config } = params;
t.deepEqual(
config,
config2,
`Unexpected config in sync path: ${config}.`
);
return Promise.resolve().then(() => {
t.deepEqual(
config,
config2,
`Unexpected config in async path: ${config}.`
);
});
}
}
],
"strings": {
"string": "# Heading"
}
};
return markdownlint.promises.markdownlint(options).then(() => null);
});

test("customRulesAsyncReadFiles", (t) => {
t.plan(3);
const options = {
Expand Down

0 comments on commit 62f5c85

Please sign in to comment.