rework html linting
authorJustin Wind <justin.wind+git@gmail.com>
Fri, 8 Mar 2024 19:42:28 +0000 (11:42 -0800)
committerJustin Wind <justin.wind+git@gmail.com>
Fri, 8 Mar 2024 19:42:57 +0000 (11:42 -0800)
index.js
test/lib/template-helper.js
test/lint-html.js

index 5a14ebf466168c028b3c7efe40f04e8bd0c68b4d..2bbc356601dd67a26a3ddc3d6948f35661b10875 100644 (file)
--- a/index.js
+++ b/index.js
@@ -1,9 +1,9 @@
 'use strict';
 
 const TemplateHelper = require('./lib/template-helper');
-const LintHtml = require('./test/lint-html');
+const { makeHtmlLint } = require('./test/lint-html');
 
 module.exports = {
   TemplateHelper,
-  LintHtml,
+  makeHtmlLint,
 };
index 968a85f75c2f9e9651252099fefbc5eb96dc026d..ec7ab5da605315edb2cee3647c938b696944c8f7 100644 (file)
@@ -4,9 +4,11 @@
 const assert = require('assert');
 const th = require('../../lib/template-helper');
 const stubLogger = require('../stub-logger');
-const LintHtml = require('../lint-html');
 
-const lintHtml = new LintHtml(stubLogger);
+const { makeHtmlLint } = require('../lint-html');
+const { HtmlValidate } = require('html-validate');
+const htmlValidate = new HtmlValidate();
+const htmlLint = makeHtmlLint(stubLogger, htmlValidate);
 
 describe('Template Helper', function () {
   let ctx, options, pagePathLevel;
@@ -266,12 +268,12 @@ describe('Template Helper', function () {
     });
     it('covers', async function () {
       const result = th.htmlPage(pagePathLevel, ctx, options, main);
-      await lintHtml.lint(result);
+      await htmlLint(result);
       assert(result);
     });
     it('covers defaults', async function () {
       const result = th.htmlPage(pagePathLevel, ctx, options, main);
-      await lintHtml.lint(result);
+      await htmlLint(result);
       assert(result);
     });
     it('covers user', async function () {
@@ -279,7 +281,7 @@ describe('Template Helper', function () {
         authenticatedProfile: 'https://user.example.com/',
       };
       const result = th.htmlPage(pagePathLevel, ctx, options, main);
-      await lintHtml.lint(result);
+      await htmlLint(result);
       assert(result);
     });
     it('covers user at root path', async function () {
@@ -288,7 +290,7 @@ describe('Template Helper', function () {
       };
       pagePathLevel = 0;
       const result = th.htmlPage(pagePathLevel, ctx, options, main);
-      await lintHtml.lint(result);
+      await htmlLint(result);
       assert(result);
     });
     it('covers logout redirect', async function () {
@@ -297,7 +299,7 @@ describe('Template Helper', function () {
       };
       ctx.url = 'https://app.example.com/this_page';
       const result = th.htmlPage(pagePathLevel, ctx, options, main);
-      await lintHtml.lint(result);
+      await htmlLint(result);
       assert(result);
     });
     it('covers existing navLinks', async function () {
@@ -309,7 +311,7 @@ describe('Template Helper', function () {
         href: 'link',
       }];
       const result = th.htmlPage(pagePathLevel, ctx, options);
-      await lintHtml.lint(result);
+      await htmlLint(result);
       assert(result);
     });
   }); // htmlPage
index 26cfed2aed97b19f2c89a2b0fb6e6f69cda119e6..50abb84784ff732d266577718906fa6227dc17ce 100644 (file)
@@ -1,28 +1,38 @@
 'use strict';
 
 /**
- * A brief wrapper around html-validate
+ * A brief assertion wrapper around html-validate.
  */
 
 const assert = require('node:assert');
-const { HtmlValidate } = require('html-validate'); // eslint-disable-line node/no-unpublished-require
-const stubLogger = require('./stub-logger');
 
-class LintHtml {
-  constructor(logger, ...args) {
-    this.logger = logger;
-    this.htmlValidate = new HtmlValidate(...args);
-  }
-
-  async lint(html) {
-    const ruleViolations = [];
-    const report = await this.htmlValidate.validateString(html);
-    report.results.forEach((m) => {
-      ruleViolations.push(m.ruleId);
-      stubLogger?.debug('LintHtml', 'message', m);
-    })
-    assert(report.valid, '' + ruleViolations.join(', '));
+/**
+ * Given an instance of html-validate, returns a function which asserts validity of some HTML.
+ * @param {ConsoleLike} logger
+ * @param {HtmlValidate} htmlValidate
+ * @returns {(html: String) => Promise<void>}
+ */
+function makeHtmlLint(logger, htmlValidate) {
+  function note(violations, message) {
+    violations.push(message.ruleId);
+    logger.debug('HtmlLint', message);
   }
+  return async function HtmlLint(html) {
+    const violations = [];
+    const report = await htmlValidate.validateString(html);
+    report.results.forEach((r) => {
+      if (Array.isArray(r)) {
+        result.forEach((m) => {
+          note(violations, m);
+        });
+      } else {
+        note(violations, r);
+      }
+    });
+    assert(report.valid, 'HTML violations: ' + violations.join(', '));
+  };
 }
 
-module.exports = LintHtml;
\ No newline at end of file
+module.exports = {
+  makeHtmlLint,
+};
\ No newline at end of file