From 4d11e60cfe2cc50e36445bb1aaaf209ea063845e Mon Sep 17 00:00:00 2001 From: David Anson Date: Tue, 30 Jul 2019 23:07:42 -0700 Subject: [PATCH] Add custom rule example to lint JavaScript code blocks using ESLint (fixes #197). --- test/lint-javascript.md | 23 +++++++++++++++++++++ test/markdownlint-test.js | 38 ++++++++++++++++++++++++++++++++++- test/rules/lint-javascript.js | 34 +++++++++++++++++++++++++++++++ test/rules/rules.js | 6 +++++- 4 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 test/lint-javascript.md create mode 100644 test/rules/lint-javascript.js diff --git a/test/lint-javascript.md b/test/lint-javascript.md new file mode 100644 index 00000000..39c5f1bf --- /dev/null +++ b/test/lint-javascript.md @@ -0,0 +1,23 @@ +# Lint JavaScript + + + +Text + +```js +"use strict"; + +var x = 0; + +console.log(x); +``` + +Text + + var y = 0; + +Text + +Text `undefined` text + +Text diff --git a/test/markdownlint-test.js b/test/markdownlint-test.js index aaa66043..6601b960 100644 --- a/test/markdownlint-test.js +++ b/test/markdownlint-test.js @@ -1952,7 +1952,7 @@ module.exports.allBuiltInRulesHaveValidUrl = module.exports.someCustomRulesHaveValidUrl = function someCustomRulesHaveValidUrl(test) { - test.expect(6); + test.expect(7); customRules.all.forEach(function forRule(rule) { test.ok(!rule.information || (Object.getPrototypeOf(rule.information) === URL.prototype)); @@ -2886,6 +2886,42 @@ module.exports.customRulesDoc = function customRulesDoc(test) { }); }; +module.exports.customRulesLintJavaScript = + function customRulesLintJavaScript(test) { + test.expect(2); + const options = { + "customRules": customRules.lintJavaScript, + "files": "test/lint-javascript.md" + }; + markdownlint(options, (err, actual) => { + test.ifError(err); + const expected = { + "test/lint-javascript.md": [ + { + "lineNumber": 10, + "ruleNames": [ "lint-javascript" ], + "ruleDescription": "Rule that lints JavaScript code", + "ruleInformation": null, + "errorDetail": "Unexpected var, use let or const instead.", + "errorContext": "var x = 0;", + "errorRange": null + }, + { + "lineNumber": 12, + "ruleNames": [ "lint-javascript" ], + "ruleDescription": "Rule that lints JavaScript code", + "ruleInformation": null, + "errorDetail": "Unexpected console statement.", + "errorContext": "console.log(x);", + "errorRange": null + } + ] + }; + test.deepEqual(actual, expected, "Unexpected issues."); + test.done(); + }); + }; + module.exports.markdownItPluginsSingle = function markdownItPluginsSingle(test) { test.expect(2); diff --git a/test/rules/lint-javascript.js b/test/rules/lint-javascript.js new file mode 100644 index 00000000..e2cb3085 --- /dev/null +++ b/test/rules/lint-javascript.js @@ -0,0 +1,34 @@ +// @ts-check + +"use strict"; + +const { filterTokens } = require("markdownlint-rule-helpers"); +const eslint = require("eslint"); +const cliEngine = new eslint.CLIEngine({}); +const linter = new eslint.Linter(); +const languageJavaScript = /js|javascript/i; + +module.exports = { + "names": [ "lint-javascript" ], + "description": "Rule that lints JavaScript code", + "tags": [ "test", "lint", "javascript" ], + "function": (params, onError) => { + filterTokens(params, "fence", (fence) => { + if (languageJavaScript.test(fence.info)) { + const config = cliEngine.getConfigForFile(params.name); + const results = linter.verify(fence.content, config); + results.forEach((result) => { + const lineNumber = fence.lineNumber + result.line; + onError({ + "lineNumber": lineNumber, + "detail": result.message, + "context": params.lines[lineNumber - 1] + }); + }); + } + }); + // Unused: + // filterTokens("code_block"), language unknown + // filterTokens("code_inline"), too brief + } +}; diff --git a/test/rules/rules.js b/test/rules/rules.js index 7d484d7b..bd080d90 100644 --- a/test/rules/rules.js +++ b/test/rules/rules.js @@ -14,9 +14,13 @@ module.exports.firstLine = firstLine; const lettersEX = require("./letters-E-X"); module.exports.lettersEX = lettersEX; +const lintJavaScript = require("./lint-javascript"); +module.exports.lintJavaScript = lintJavaScript; + module.exports.all = [ anyBlockquote, everyNLines, firstLine, - lettersEX + lettersEX, + lintJavaScript ];