'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)) {
+ r.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