html-validate 10.14.0 → 10.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -33,6 +33,7 @@ exports.NestedError = core.NestedError;
33
33
  exports.NodeClosed = core.NodeClosed;
34
34
  exports.NodeType = core.NodeType;
35
35
  exports.Parser = core.Parser;
36
+ exports.PerformanceTracker = core.PerformanceTracker;
36
37
  exports.Reporter = core.Reporter;
37
38
  exports.ResolvedConfig = core.ResolvedConfig;
38
39
  exports.Rule = core.Rule;
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"browser.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/cjs/cli.js CHANGED
@@ -512,20 +512,62 @@ async function init(cli, output, options) {
512
512
  return true;
513
513
  }
514
514
 
515
+ function formatMs(ms) {
516
+ return `${ms.toFixed(2)}ms`;
517
+ }
518
+ function formatPerformanceTable(nameHeader, entries, totalTime) {
519
+ const nameWidth = Math.max(nameHeader.length, ...entries.map((e) => e.name.length)) + 2;
520
+ const countWidth = Math.max(5, ...entries.map((e) => String(e.count).length)) + 2;
521
+ const header = ` ${nameHeader.padEnd(nameWidth)}${"count".padStart(countWidth)} ${"time(ms)".padStart(10)} ${"time(%)".padStart(8)}`;
522
+ const separator = ` ${"\u2500".repeat(header.length - 2)}`;
523
+ const rows = entries.map((entry) => {
524
+ const pct = totalTime > 0 ? (entry.time / totalTime * 100).toFixed(1) : "0.0";
525
+ const pctStr = `${pct}%`;
526
+ return ` ${entry.name.padEnd(nameWidth)}${String(entry.count).padStart(countWidth)} ${formatMs(entry.time).padStart(10)} ${pctStr.padStart(8)}`;
527
+ });
528
+ return [header, separator, ...rows].join("\n");
529
+ }
530
+ function formatPerformanceResult(result) {
531
+ const totalEventTime = result.events.reduce((sum, e) => sum + e.time, 0);
532
+ const totalRuleTime = result.rules.reduce((sum, e) => sum + e.time, 0);
533
+ const { configTime, transformTime, totalTime } = result;
534
+ const eventEntries = result.events.map((e) => ({ name: e.event, count: e.count, time: e.time }));
535
+ const ruleEntries = result.rules.map((e) => ({ name: e.rule, count: e.count, time: e.time }));
536
+ const lines = [
537
+ "Performance",
538
+ "",
539
+ "Events:",
540
+ formatPerformanceTable("event", eventEntries, totalTime),
541
+ "",
542
+ "Rules:",
543
+ formatPerformanceTable("rule", ruleEntries, totalTime),
544
+ "",
545
+ `Total: ${formatMs(totalTime)}`,
546
+ ` Config: ${formatMs(configTime)}`,
547
+ ` Transform: ${formatMs(transformTime)}`,
548
+ ` Events: ${formatMs(totalEventTime - totalRuleTime)}`,
549
+ ` Rules: ${formatMs(totalRuleTime)}`,
550
+ ""
551
+ ];
552
+ return lines.join("\n");
553
+ }
515
554
  function renameStdin(report, filename) {
516
555
  const stdin = report.results.find((cur) => cur.filePath === "/dev/stdin");
517
556
  if (stdin) {
518
557
  stdin.filePath = filename;
519
558
  }
520
559
  }
521
- async function lint(htmlvalidate, output, files, options) {
560
+ async function lint(htmlvalidate, stdout, stderr, files, options) {
561
+ if (options.performance) {
562
+ htmlvalidate.startPerformance();
563
+ }
522
564
  const reports = [];
523
565
  for (const filename of files) {
524
566
  try {
525
567
  reports.push(await htmlvalidate.validateFile(filename));
526
568
  } catch (err) {
527
569
  const message = kleur__default.default.red(`Validator crashed when parsing "${filename}"`);
528
- output.write(`${message}
570
+ stdout.write(`${message}
529
571
  `);
530
572
  throw err;
531
573
  }
@@ -534,9 +576,13 @@ async function lint(htmlvalidate, output, files, options) {
534
576
  if (options.stdinFilename) {
535
577
  renameStdin(merged, options.stdinFilename);
536
578
  }
537
- output.write(options.formatter(merged));
579
+ stdout.write(options.formatter(merged));
580
+ if (options.performance) {
581
+ const performanceResult = htmlvalidate.stopPerformance();
582
+ stderr.write(formatPerformanceResult(performanceResult));
583
+ }
538
584
  if (options.maxWarnings >= 0 && merged.warningCount > options.maxWarnings) {
539
- output.write(
585
+ stdout.write(
540
586
  `
541
587
  html-validate found too many warnings (maximum: ${String(options.maxWarnings)}).
542
588
  `
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["../../src/cli/expand-files.ts","../../src/cli/formatter.ts","../../src/cli/parse-severity.ts","../../src/cli/get-rule-config.ts","../../src/cli/init.ts","../../src/cli/is-ignored.ts","../../src/cli/cli.ts","../../src/cli/json.ts","../../src/cli/mode.ts","../../src/cli/actions/dump.ts","../../src/cli/actions/init.ts","../../src/cli/actions/lint.ts","../../src/cli/actions/print-config.ts","../../src/cli/errors/handle-schema-validation-error.ts","../../src/cli/errors/import-resolve-missing-error.ts","../../src/cli/have-import-meta-resolve.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { globSync } from \"glob\";\n\nconst DEFAULT_EXTENSIONS = [\"html\"];\n\n/**\n * @public\n */\nexport interface ExpandOptions {\n\t/**\n\t * Working directory. Defaults to `process.cwd()`.\n\t */\n\tcwd?: string;\n\n\t/**\n\t * List of extensions to search for when expanding directories. Extensions\n\t * should be passed without leading dot, e.g. \"html\" instead of \".html\".\n\t */\n\textensions?: string[];\n}\n\nfunction isDirectory(filename: string): boolean {\n\tconst st = fs.statSync(filename);\n\treturn st.isDirectory();\n}\n\nfunction join(stem: string, filename: string): string {\n\tif (path.isAbsolute(filename)) {\n\t\treturn path.normalize(filename);\n\t} else {\n\t\treturn path.normalize(path.join(stem, filename));\n\t}\n}\n\nfunction directoryPattern(extensions: string[]): string {\n\tswitch (extensions.length) {\n\t\tcase 0:\n\t\t\treturn \"**/*\";\n\t\tcase 1:\n\t\t\treturn `**/*.${extensions[0]}`;\n\t\tdefault:\n\t\t\treturn `**/*.{${extensions.join(\",\")}}`;\n\t}\n}\n\n/**\n * Takes a number of file patterns (globs) and returns array of expanded\n * filenames.\n */\nexport function expandFiles(patterns: string[], options: ExpandOptions): string[] {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n\n\tconst files = patterns.reduce((result: string[], pattern: string) => {\n\t\t/* process - as standard input */\n\t\tif (pattern === \"-\") {\n\t\t\tresult.push(\"/dev/stdin\");\n\t\t\treturn result;\n\t\t}\n\n\t\tfor (const filename of globSync(pattern, { cwd })) {\n\t\t\t/* if file is a directory recursively expand files from it */\n\t\t\tconst fullpath = join(cwd, filename);\n\t\t\tif (isDirectory(fullpath)) {\n\t\t\t\tconst dir = expandFiles([directoryPattern(extensions)], { ...options, cwd: fullpath });\n\t\t\t\tresult = result.concat(dir.map((cur) => join(filename, cur)));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tresult.push(fullpath);\n\t\t}\n\n\t\treturn result.toSorted((a, b) => {\n\t\t\tconst pa = a.split(\"/\").length;\n\t\t\tconst pb = b.split(\"/\").length;\n\t\t\tif (pa !== pb) {\n\t\t\t\treturn pa - pb;\n\t\t\t} else {\n\t\t\t\treturn a > b ? 1 : -1;\n\t\t\t}\n\t\t});\n\t}, []);\n\n\t/* only return unique matches */\n\treturn Array.from(new Set(files));\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { type Formatter, type Report, type Result, UserError, formatterFactory } from \"..\";\nimport { ensureError } from \"../error\";\nimport { legacyRequire } from \"../resolve\";\n\ntype WrappedFormatter = (results: Result[]) => string;\n\nfunction wrap(formatter: Formatter, dst: string): (results: Result[]) => string {\n\treturn (results: Result[]) => {\n\t\tconst output = formatter(results);\n\t\tif (dst) {\n\t\t\tconst dir = path.dirname(dst);\n\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t}\n\t\t\tfs.writeFileSync(dst, output, \"utf-8\");\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\treturn output;\n\t\t}\n\t};\n}\n\nfunction loadFormatter(name: string): Formatter {\n\tconst fn = formatterFactory(name);\n\tif (fn) {\n\t\treturn fn;\n\t}\n\n\ttry {\n\t\treturn legacyRequire(name) as Formatter;\n\t} catch (error: unknown) {\n\t\tthrow new UserError(`No formatter named \"${name}\"`, ensureError(error));\n\t}\n}\n\nexport function getFormatter(formatters: string): (report: Report) => string {\n\tconst fn: WrappedFormatter[] = formatters.split(\",\").map((cur) => {\n\t\tconst [name, dst] = cur.split(\"=\", 2);\n\t\tconst fn = loadFormatter(name);\n\t\treturn wrap(fn, dst);\n\t});\n\treturn (report: Report) => {\n\t\treturn fn\n\t\t\t.map((formatter: WrappedFormatter) => formatter(report.results))\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\");\n\t};\n}\n","import { type RuleSeverity } from \"../config\";\n\n/**\n * @internal\n */\nexport function parseSeverity(ruleId: string, severity: string): RuleSeverity {\n\tswitch (severity) {\n\t\tcase \"off\":\n\t\tcase \"0\":\n\t\t\treturn \"off\";\n\t\tcase \"warn\":\n\t\tcase \"1\":\n\t\t\treturn \"warn\";\n\t\tcase \"error\":\n\t\tcase \"2\":\n\t\t\treturn \"error\";\n\t\tdefault:\n\t\t\tthrow new Error(`Invalid severity \"${severity}\" for rule \"${ruleId}\"`);\n\t}\n}\n","import { type RuleConfig, type RuleSeverity } from \"../config\";\nimport { parseSeverity } from \"./parse-severity\";\n\nfunction parseItem(value: string): { ruleId: string; severity: RuleSeverity } {\n\tconst [ruleId, severity = \"error\"] = value.split(\":\", 2);\n\treturn { ruleId, severity: parseSeverity(ruleId, severity) };\n}\n\n/**\n * @internal\n */\nexport function getRuleConfig(values: string | string[]): RuleConfig {\n\tif (typeof values === \"string\") {\n\t\treturn getRuleConfig([values]);\n\t}\n\n\treturn values.reduce<RuleConfig>((parsedRules, value) => {\n\t\tconst { ruleId, severity } = parseItem(value.trim());\n\t\treturn { [ruleId]: severity, ...parsedRules };\n\t}, {});\n}\n","import fs from \"node:fs\";\nimport deepmerge from \"deepmerge\";\nimport prompts from \"prompts\";\nimport { type ConfigData } from \"..\";\n\n/**\n * @public\n */\nexport interface InitResult {\n\tfilename: string;\n}\n\nexport enum Frameworks {\n\tangularjs = \"AngularJS\",\n\tvuejs = \"Vue.js\",\n\tmarkdown = \"Markdown\",\n}\n\nconst frameworkConfig: Record<string, ConfigData> = {\n\t[Frameworks.angularjs]: {\n\t\ttransform: {\n\t\t\t\"^.*\\\\.js$\": \"html-validate-angular/js\",\n\t\t\t\"^.*\\\\.html$\": \"html-validate-angular/html\",\n\t\t},\n\t},\n\t[Frameworks.vuejs]: {\n\t\tplugins: [\"html-validate-vue\"],\n\t\textends: [\"html-validate-vue:recommended\"],\n\t\ttransform: {\n\t\t\t\"^.*\\\\.vue$\": \"html-validate-vue\",\n\t\t},\n\t},\n\t[Frameworks.markdown]: {\n\t\ttransform: {\n\t\t\t\"^.*\\\\.md$\": \"html-validate-markdown\",\n\t\t},\n\t},\n};\n\nfunction addFrameworks(src: ConfigData, frameworks: string[]): ConfigData {\n\tlet config = src;\n\tfor (const framework of frameworks) {\n\t\tconfig = deepmerge(config, frameworkConfig[framework]);\n\t}\n\treturn config;\n}\n\nfunction writeConfig(dst: string, config: ConfigData): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tfs.writeFile(dst, JSON.stringify(config, null, 2), (err) => {\n\t\t\tif (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t\tresolve();\n\t\t});\n\t});\n}\n\nexport async function init(cwd: string): Promise<InitResult> {\n\tconst filename = `${cwd}/.htmlvalidate.json`;\n\tconst exists = fs.existsSync(filename);\n\tconst initialConfig: ConfigData = {\n\t\telements: [\"html5\"],\n\t\textends: [\"html-validate:recommended\"],\n\t};\n\n\t/* confirm overwrite */\n\tif (exists) {\n\t\tconst result = await prompts({\n\t\t\tname: \"overwrite\",\n\t\t\ttype: \"confirm\",\n\t\t\tmessage: \"A .htmlvalidate.json file already exists, do you want to overwrite it?\",\n\t\t});\n\t\tif (!result.overwrite) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors, unicorn/no-useless-promise-resolve-reject -- technical debt, should not result in failure at all */\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\n\tconst questions: prompts.PromptObject[] = [\n\t\t{\n\t\t\tname: \"frameworks\",\n\t\t\ttype: \"multiselect\",\n\t\t\tchoices: [\n\t\t\t\t{ title: Frameworks.angularjs, value: Frameworks.angularjs },\n\t\t\t\t{ title: Frameworks.vuejs, value: Frameworks.vuejs },\n\t\t\t\t{ title: Frameworks.markdown, value: Frameworks.markdown },\n\t\t\t],\n\t\t\tmessage: \"Support additional frameworks?\",\n\t\t},\n\t];\n\n\t/* prompt user for questions */\n\tconst answers = await prompts(questions);\n\n\t/* write configuration to file */\n\tlet config = initialConfig;\n\tconfig = addFrameworks(config, answers[\"frameworks\"] as string[]);\n\tawait writeConfig(filename, config);\n\n\treturn {\n\t\tfilename,\n\t};\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport ignore, { type Ignore } from \"ignore\";\n\nexport class IsIgnored {\n\t/** Cache for parsed .htmlvalidateignore files */\n\tprivate cacheIgnore: Map<string, Ignore | undefined>;\n\n\tpublic constructor() {\n\t\tthis.cacheIgnore = new Map();\n\t}\n\n\t/**\n\t * Searches \".htmlvalidateignore\" files from filesystem and returns `true` if\n\t * one of them contains a pattern matching given filename.\n\t */\n\tpublic isIgnored(filename: string): boolean {\n\t\treturn this.match(filename);\n\t}\n\n\t/**\n\t * Clear cache\n\t */\n\tpublic clearCache(): void {\n\t\tthis.cacheIgnore.clear();\n\t}\n\n\tprivate match(target: string): boolean {\n\t\tlet current = path.dirname(target);\n\n\t\tfor (;;) {\n\t\t\tconst relative = path.relative(current, target);\n\t\t\tconst filename = path.join(current, \".htmlvalidateignore\");\n\n\t\t\t/* test filename (relative to the ignore file) against the patterns */\n\t\t\tconst ig = this.parseFile(filename);\n\t\t\tif (ig?.ignores(relative)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t/* get the parent directory */\n\t\t\tconst child = current;\n\t\t\tcurrent = path.dirname(current);\n\n\t\t\t/* stop if this is the root directory */\n\t\t\tif (current === child) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate parseFile(filename: string): Ignore | undefined {\n\t\tif (this.cacheIgnore.has(filename)) {\n\t\t\treturn this.cacheIgnore.get(filename);\n\t\t}\n\n\t\tif (!fs.existsSync(filename)) {\n\t\t\tthis.cacheIgnore.set(filename, undefined);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst content = fs.readFileSync(filename, \"utf-8\");\n\t\tconst ig = ignore().add(content);\n\t\tthis.cacheIgnore.set(filename, ig);\n\t\treturn ig;\n\t}\n}\n","import path from \"node:path/posix\";\nimport {\n\ttype ConfigData,\n\ttype ConfigLoader,\n\ttype Report,\n\tFileSystemConfigLoader,\n\tHtmlValidate,\n\tUserError,\n\tesmResolver,\n} from \"..\";\nimport { type ExpandOptions, expandFiles } from \"./expand-files\";\nimport { getFormatter } from \"./formatter\";\nimport { getRuleConfig } from \"./get-rule-config\";\nimport { type InitResult, init } from \"./init\";\nimport { IsIgnored } from \"./is-ignored\";\n\nconst resolver = esmResolver();\n\nfunction defaultConfig(preset: string): ConfigData {\n\tconst presets = preset.split(\",\").map((it) => `html-validate:${it}`);\n\treturn {\n\t\textends: presets,\n\t};\n}\n\n/**\n * @public\n */\nexport interface CLIOptions {\n\tconfigFile?: string;\n\t/** Comma-separated list of presets to use */\n\tpreset?: string;\n\trules?: string | string[];\n}\n\nasync function getBaseConfig(preset?: string, filename?: string): Promise<ConfigData> {\n\tif (filename) {\n\t\tconst configData = await resolver.resolveConfig(path.resolve(filename), { cache: false });\n\t\tif (!configData) {\n\t\t\tthrow new UserError(`Failed to read configuration from \"${filename}\"`);\n\t\t}\n\t\treturn configData;\n\t} else {\n\t\treturn defaultConfig(preset ?? \"recommended\");\n\t}\n}\n\n/**\n * @public\n */\nexport class CLI {\n\tprivate options: CLIOptions;\n\tprivate config: ConfigData | null;\n\tprivate loader: ConfigLoader | null;\n\tprivate ignored: IsIgnored;\n\n\t/**\n\t * Create new CLI helper.\n\t *\n\t * Can be used to create tooling with similar properties to bundled CLI\n\t * script.\n\t */\n\tpublic constructor(options?: CLIOptions) {\n\t\tthis.options = options ?? {};\n\t\tthis.config = null;\n\t\tthis.loader = null;\n\t\tthis.ignored = new IsIgnored();\n\t}\n\n\t/**\n\t * Returns list of files matching patterns and are not ignored. Filenames will\n\t * have absolute paths.\n\t *\n\t * @public\n\t */\n\t/* eslint-disable-next-line @typescript-eslint/require-await -- technical debt: expandFiles(..) should actually be async as well */\n\tpublic async expandFiles(patterns: string[], options: ExpandOptions = {}): Promise<string[]> {\n\t\treturn expandFiles(patterns, options).filter((filename) => !this.isIgnored(filename));\n\t}\n\n\tpublic getFormatter(formatters: string): Promise<(report: Report) => string> {\n\t\t/* while not actually async the API boundary returns a Promise in case it needs to in the future, i.e a ESM-based formatter */\n\t\treturn Promise.resolve(getFormatter(formatters));\n\t}\n\n\t/**\n\t * Initialize project with a new configuration.\n\t *\n\t * A new `.htmlvalidate.json` file will be placed in the path provided by\n\t * `cwd`.\n\t */\n\tpublic init(cwd: string): Promise<InitResult> {\n\t\treturn init(cwd);\n\t}\n\n\t/**\n\t * Clear cache.\n\t *\n\t * Previously fetched [[HtmlValidate]] instances must either be fetched again\n\t * or call [[HtmlValidate.flushConfigCache]].\n\t */\n\t/* istanbul ignore next: each method is tested separately */\n\tpublic clearCache(): Promise<void> {\n\t\tif (this.loader) {\n\t\t\tthis.loader.flushCache();\n\t\t}\n\t\tthis.ignored.clearCache();\n\t\treturn Promise.resolve();\n\t}\n\n\t/**\n\t * Get HtmlValidate instance with configuration based on options passed to the\n\t * constructor.\n\t *\n\t * @internal\n\t */\n\tpublic async getLoader(): Promise<ConfigLoader> {\n\t\t/* istanbul ignore next: cache will most likely be cold during testing */\n\t\tif (!this.loader) {\n\t\t\tconst config = await this.getConfig();\n\t\t\tthis.loader = new FileSystemConfigLoader([resolver], config);\n\t\t}\n\t\treturn this.loader;\n\t}\n\n\t/**\n\t * Get HtmlValidate instance with configuration based on options passed to the\n\t * constructor.\n\t *\n\t * @public\n\t */\n\tpublic async getValidator(): Promise<HtmlValidate> {\n\t\tconst loader = await this.getLoader();\n\t\treturn new HtmlValidate(loader);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic async getConfig(): Promise<ConfigData> {\n\t\tthis.config ??= await this.resolveConfig();\n\t\treturn this.config;\n\t}\n\n\t/**\n\t * Searches \".htmlvalidateignore\" files from filesystem and returns `true` if\n\t * one of them contains a pattern matching given filename.\n\t */\n\tprivate isIgnored(filename: string): boolean {\n\t\treturn this.ignored.isIgnored(filename);\n\t}\n\n\tprivate async resolveConfig(): Promise<ConfigData> {\n\t\tconst { options } = this;\n\t\tconst havePreset = Boolean(options.preset);\n\t\tconst haveConfig = Boolean(options.configFile);\n\t\tconst config = await getBaseConfig(options.preset, options.configFile);\n\t\tif (options.rules) {\n\t\t\tif (havePreset || haveConfig) {\n\t\t\t\t/* when rules are explicitly specified and combined with an explicit\n\t\t\t\t * preset or configuration file we merge the result as the user would\n\t\t\t\texpect rules from the preset or configuration files to be used */\n\t\t\t\tconfig.rules = { ...config.rules, ...getRuleConfig(options.rules) };\n\t\t\t} else {\n\t\t\t\t/* if neither an explicit configuration file or preset is passed as a\n\t\t\t\t * CLI argument a default configuration is loaded but since the user has\n\t\t\t\t * specified one or more rules explicitly we overwrite both the default\n\t\t\t\t * preset and the default rules with the explicit rules */\n\t\t\t\tconfig.extends = [];\n\t\t\t\tconfig.rules = getRuleConfig(options.rules);\n\t\t\t}\n\t\t}\n\t\treturn config;\n\t}\n}\n","import { type EventDump, type Location } from \"..\";\n\nconst jsonIgnored = new Set([\n\t\"annotation\",\n\t\"blockedRules\",\n\t\"cache\",\n\t\"closed\",\n\t\"depth\",\n\t\"disabledRules\",\n\t\"nodeType\",\n\t\"unique\",\n\t\"voidElement\",\n]);\nconst jsonFiltered = new Set([\n\t\"childNodes\",\n\t\"children\",\n\t\"data\",\n\t\"meta\",\n\t\"metaElement\",\n\t\"originalData\",\n\t\"parent\",\n]);\n\nfunction isLocation(key: string, value: unknown): value is Location {\n\treturn Boolean(value && (key === \"location\" || key.endsWith(\"Location\")));\n}\n\nfunction isIgnored(key: string): boolean {\n\treturn key.startsWith(\"_\") || jsonIgnored.has(key);\n}\n\nfunction isFiltered(key: string, value: unknown): boolean {\n\treturn Boolean(value && jsonFiltered.has(key));\n}\n\nexport function eventReplacer<T>(this: void, key: string, value: T): T | string | undefined {\n\tif (isLocation(key, value)) {\n\t\tconst filename = value.filename;\n\t\tconst line = String(value.line);\n\t\tconst column = String(value.column);\n\t\treturn `${filename}:${line}:${column}`;\n\t}\n\tif (isIgnored(key)) {\n\t\treturn undefined;\n\t}\n\tif (isFiltered(key, value)) {\n\t\treturn \"[truncated]\";\n\t}\n\treturn value;\n}\n\nexport function eventFormatter(entry: EventDump): string {\n\tconst strdata = JSON.stringify(entry.data, eventReplacer, 2);\n\treturn `${entry.event}: ${strdata}`;\n}\n","/**\n * @internal\n */\nexport enum Mode {\n\tLINT,\n\tINIT,\n\tDUMP_EVENTS,\n\tDUMP_TOKENS,\n\tDUMP_TREE,\n\tDUMP_SOURCE,\n\tPRINT_CONFIG,\n}\n\n/**\n * @internal\n */\nexport function modeToFlag(mode: Mode.LINT): null;\nexport function modeToFlag(mode: Exclude<Mode, Mode.LINT>): string;\nexport function modeToFlag(mode: Mode): string | null;\nexport function modeToFlag(mode: Mode): string | null {\n\tswitch (mode) {\n\t\tcase Mode.LINT:\n\t\t\treturn null;\n\t\tcase Mode.INIT:\n\t\t\treturn \"--init\";\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\treturn \"--dump-events\";\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\treturn \"--dump-tokens\";\n\t\tcase Mode.DUMP_TREE:\n\t\t\treturn \"--dump-tree\";\n\t\tcase Mode.DUMP_SOURCE:\n\t\t\treturn \"--dump-source\";\n\t\tcase Mode.PRINT_CONFIG:\n\t\t\treturn \"--print-config\";\n\t}\n}\n","import { type HtmlValidate, type TokenDump } from \"../..\";\nimport { eventFormatter } from \"../json\";\nimport { Mode } from \"../mode\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport async function dump(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n\tmode: Mode,\n): Promise<boolean> {\n\tlet lines: Array<Promise<string[]>>;\n\tswitch (mode) {\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\tlines = files.map(async (filename: string) => {\n\t\t\t\tconst lines = await htmlvalidate.dumpEvents(filename);\n\t\t\t\treturn lines.map(eventFormatter);\n\t\t\t});\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\tlines = files.map(async (filename: string) => {\n\t\t\t\tconst lines = await htmlvalidate.dumpTokens(filename);\n\t\t\t\treturn lines.map((entry: TokenDump) => {\n\t\t\t\t\tconst data = JSON.stringify(entry.data);\n\t\t\t\t\treturn `TOKEN: ${entry.token}\\n Data: ${data}\\n Location: ${entry.location}`;\n\t\t\t\t});\n\t\t\t});\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TREE:\n\t\t\tlines = files.map((filename: string) => htmlvalidate.dumpTree(filename));\n\t\t\tbreak;\n\t\tcase Mode.DUMP_SOURCE:\n\t\t\tlines = files.map((filename: string) => htmlvalidate.dumpSource(filename));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown mode \"${String(mode)}\"`);\n\t}\n\tconst results = await Promise.all(lines);\n\tconst flat = results.flat();\n\toutput.write(flat.join(\"\\n\"));\n\toutput.write(\"\\n\");\n\treturn true;\n}\n","import { type CLI } from \"../cli\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport interface InitOptions {\n\tcwd: string;\n}\n\nexport async function init(\n\tcli: CLI,\n\toutput: WritableStreamLike,\n\toptions: InitOptions,\n): Promise<boolean> {\n\tconst result = await cli.init(options.cwd);\n\toutput.write(`Configuration written to \"${result.filename}\"\\n`);\n\treturn true;\n}\n","import kleur from \"kleur\";\nimport { type HtmlValidate, type Report, type Result, Reporter } from \"../..\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport interface LintOptions {\n\tformatter: (report: Report) => string;\n\tmaxWarnings: number;\n\tstdinFilename: false | string;\n}\n\nfunction renameStdin(report: Report, filename: string): void {\n\tconst stdin = report.results.find((cur: Result) => cur.filePath === \"/dev/stdin\");\n\tif (stdin) {\n\t\tstdin.filePath = filename;\n\t}\n}\n\nexport async function lint(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n\toptions: LintOptions,\n): Promise<boolean> {\n\tconst reports: Report[] = [];\n\tfor (const filename of files) {\n\t\ttry {\n\t\t\treports.push(await htmlvalidate.validateFile(filename));\n\t\t} catch (err) {\n\t\t\tconst message = kleur.red(`Validator crashed when parsing \"${filename}\"`);\n\t\t\toutput.write(`${message}\\n`);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tconst merged = Reporter.merge(reports);\n\n\t/* rename stdin if an explicit filename was passed */\n\tif (options.stdinFilename) {\n\t\trenameStdin(merged, options.stdinFilename);\n\t}\n\n\toutput.write(options.formatter(merged));\n\n\tif (options.maxWarnings >= 0 && merged.warningCount > options.maxWarnings) {\n\t\toutput.write(\n\t\t\t`\\nhtml-validate found too many warnings (maximum: ${String(options.maxWarnings)}).\\n`,\n\t\t);\n\t\treturn false;\n\t}\n\n\treturn merged.valid;\n}\n","import { type HtmlValidate } from \"../..\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport async function printConfig(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n): Promise<boolean> {\n\tif (files.length > 1) {\n\t\toutput.write(`\\`--print-config\\` expected a single filename but got multiple:\\n\\n`);\n\t\tfor (const filename of files) {\n\t\t\toutput.write(` - ${filename}\\n`);\n\t\t}\n\t\toutput.write(\"\\n\");\n\t\treturn false;\n\t}\n\tconst config = await htmlvalidate.getConfigFor(files[0]);\n\tconst json = JSON.stringify(config.getConfigData(), null, 2);\n\toutput.write(`${json}\\n`);\n\treturn true;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport betterAjvErrors from \"@sidvind/better-ajv-errors\";\nimport kleur from \"kleur\";\nimport { type SchemaValidationError } from \"../../error\";\n\nfunction prettyError(err: SchemaValidationError): string {\n\tlet json: string | undefined;\n\tif (err.filename && fs.existsSync(err.filename)) {\n\t\tjson = fs.readFileSync(err.filename, \"utf-8\");\n\t}\n\treturn betterAjvErrors(err.schema, err.obj, err.errors, {\n\t\tformat: \"cli\",\n\t\tindent: 2,\n\t\tjson,\n\t});\n}\n\n/**\n * @internal\n */\nexport function handleSchemaValidationError(console: Console, err: SchemaValidationError): void {\n\tif (err.filename) {\n\t\tconst filename = path.relative(process.cwd(), err.filename);\n\t\tconsole.error(kleur.red(`A configuration error was found in \"${filename}\":`));\n\t} else {\n\t\tconsole.error(kleur.red(`A configuration error was found:`));\n\t}\n\tconsole.group();\n\t{\n\t\tconsole.error(prettyError(err));\n\t}\n\tconsole.groupEnd();\n}\n","import kleur from \"kleur\";\nimport { engines } from \"../../../package.json\";\nimport { UserError } from \"../../error\";\n\n/**\n * @internal\n */\nexport class ImportResolveMissingError extends UserError {\n\tpublic constructor() {\n\t\tconst message = `import.meta.resolve(..) is not available on this system`;\n\t\tsuper(message);\n\t\tthis.name = \"ImportResolveMissingError\";\n\t}\n\n\tpublic override prettyFormat(): string {\n\t\tconst { message } = this;\n\t\tconst currentVersion = process.version;\n\t\tconst requiredVersion = engines.node\n\t\t\t.split(\"||\")\n\t\t\t.map((it) => `v${it.replace(/^\\D+/, \"\").trim()}`);\n\t\treturn [\n\t\t\tkleur.red(`Error: ${message}.`),\n\t\t\t\"\",\n\t\t\t`Either ensure you are running a supported NodeJS version:`,\n\t\t\t` Current: ${currentVersion}`,\n\t\t\t` Required: ${requiredVersion.join(\", \")} or later`,\n\t\t\t`Or set NODE_OPTIONS=\"--experimental-import-meta-resolve\"`,\n\t\t].join(\"\\n\");\n\t}\n}\n","/**\n * @internal\n */\nexport function haveImportMetaResolve(): boolean {\n\treturn \"resolve\" in import.meta;\n}\n"],"names":["fs","path","globSync","formatterFactory","legacyRequire","UserError","ensureError","fn","deepmerge","init","prompts","ignore","esmResolver","FileSystemConfigLoader","HtmlValidate","Mode","lines","kleur","Reporter","betterAjvErrors","engines"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sources":["../../src/cli/expand-files.ts","../../src/cli/formatter.ts","../../src/cli/parse-severity.ts","../../src/cli/get-rule-config.ts","../../src/cli/init.ts","../../src/cli/is-ignored.ts","../../src/cli/cli.ts","../../src/cli/json.ts","../../src/cli/mode.ts","../../src/cli/actions/dump.ts","../../src/cli/actions/init.ts","../../src/cli/actions/lint.ts","../../src/cli/actions/print-config.ts","../../src/cli/errors/handle-schema-validation-error.ts","../../src/cli/errors/import-resolve-missing-error.ts","../../src/cli/have-import-meta-resolve.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { globSync } from \"glob\";\n\nconst DEFAULT_EXTENSIONS = [\"html\"];\n\n/**\n * @public\n */\nexport interface ExpandOptions {\n\t/**\n\t * Working directory. Defaults to `process.cwd()`.\n\t */\n\tcwd?: string;\n\n\t/**\n\t * List of extensions to search for when expanding directories. Extensions\n\t * should be passed without leading dot, e.g. \"html\" instead of \".html\".\n\t */\n\textensions?: string[];\n}\n\nfunction isDirectory(filename: string): boolean {\n\tconst st = fs.statSync(filename);\n\treturn st.isDirectory();\n}\n\nfunction join(stem: string, filename: string): string {\n\tif (path.isAbsolute(filename)) {\n\t\treturn path.normalize(filename);\n\t} else {\n\t\treturn path.normalize(path.join(stem, filename));\n\t}\n}\n\nfunction directoryPattern(extensions: string[]): string {\n\tswitch (extensions.length) {\n\t\tcase 0:\n\t\t\treturn \"**/*\";\n\t\tcase 1:\n\t\t\treturn `**/*.${extensions[0]}`;\n\t\tdefault:\n\t\t\treturn `**/*.{${extensions.join(\",\")}}`;\n\t}\n}\n\n/**\n * Takes a number of file patterns (globs) and returns array of expanded\n * filenames.\n */\nexport function expandFiles(patterns: string[], options: ExpandOptions): string[] {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst extensions = options.extensions ?? DEFAULT_EXTENSIONS;\n\n\tconst files = patterns.reduce((result: string[], pattern: string) => {\n\t\t/* process - as standard input */\n\t\tif (pattern === \"-\") {\n\t\t\tresult.push(\"/dev/stdin\");\n\t\t\treturn result;\n\t\t}\n\n\t\tfor (const filename of globSync(pattern, { cwd })) {\n\t\t\t/* if file is a directory recursively expand files from it */\n\t\t\tconst fullpath = join(cwd, filename);\n\t\t\tif (isDirectory(fullpath)) {\n\t\t\t\tconst dir = expandFiles([directoryPattern(extensions)], { ...options, cwd: fullpath });\n\t\t\t\tresult = result.concat(dir.map((cur) => join(filename, cur)));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tresult.push(fullpath);\n\t\t}\n\n\t\treturn result.toSorted((a, b) => {\n\t\t\tconst pa = a.split(\"/\").length;\n\t\t\tconst pb = b.split(\"/\").length;\n\t\t\tif (pa !== pb) {\n\t\t\t\treturn pa - pb;\n\t\t\t} else {\n\t\t\t\treturn a > b ? 1 : -1;\n\t\t\t}\n\t\t});\n\t}, []);\n\n\t/* only return unique matches */\n\treturn Array.from(new Set(files));\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { type Formatter, type Report, type Result, UserError, formatterFactory } from \"..\";\nimport { ensureError } from \"../error\";\nimport { legacyRequire } from \"../resolve\";\n\ntype WrappedFormatter = (results: Result[]) => string;\n\nfunction wrap(formatter: Formatter, dst: string): (results: Result[]) => string {\n\treturn (results: Result[]) => {\n\t\tconst output = formatter(results);\n\t\tif (dst) {\n\t\t\tconst dir = path.dirname(dst);\n\t\t\tif (!fs.existsSync(dir)) {\n\t\t\t\tfs.mkdirSync(dir, { recursive: true });\n\t\t\t}\n\t\t\tfs.writeFileSync(dst, output, \"utf-8\");\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\treturn output;\n\t\t}\n\t};\n}\n\nfunction loadFormatter(name: string): Formatter {\n\tconst fn = formatterFactory(name);\n\tif (fn) {\n\t\treturn fn;\n\t}\n\n\ttry {\n\t\treturn legacyRequire(name) as Formatter;\n\t} catch (error: unknown) {\n\t\tthrow new UserError(`No formatter named \"${name}\"`, ensureError(error));\n\t}\n}\n\nexport function getFormatter(formatters: string): (report: Report) => string {\n\tconst fn: WrappedFormatter[] = formatters.split(\",\").map((cur) => {\n\t\tconst [name, dst] = cur.split(\"=\", 2);\n\t\tconst fn = loadFormatter(name);\n\t\treturn wrap(fn, dst);\n\t});\n\treturn (report: Report) => {\n\t\treturn fn\n\t\t\t.map((formatter: WrappedFormatter) => formatter(report.results))\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\");\n\t};\n}\n","import { type RuleSeverity } from \"../config\";\n\n/**\n * @internal\n */\nexport function parseSeverity(ruleId: string, severity: string): RuleSeverity {\n\tswitch (severity) {\n\t\tcase \"off\":\n\t\tcase \"0\":\n\t\t\treturn \"off\";\n\t\tcase \"warn\":\n\t\tcase \"1\":\n\t\t\treturn \"warn\";\n\t\tcase \"error\":\n\t\tcase \"2\":\n\t\t\treturn \"error\";\n\t\tdefault:\n\t\t\tthrow new Error(`Invalid severity \"${severity}\" for rule \"${ruleId}\"`);\n\t}\n}\n","import { type RuleConfig, type RuleSeverity } from \"../config\";\nimport { parseSeverity } from \"./parse-severity\";\n\nfunction parseItem(value: string): { ruleId: string; severity: RuleSeverity } {\n\tconst [ruleId, severity = \"error\"] = value.split(\":\", 2);\n\treturn { ruleId, severity: parseSeverity(ruleId, severity) };\n}\n\n/**\n * @internal\n */\nexport function getRuleConfig(values: string | string[]): RuleConfig {\n\tif (typeof values === \"string\") {\n\t\treturn getRuleConfig([values]);\n\t}\n\n\treturn values.reduce<RuleConfig>((parsedRules, value) => {\n\t\tconst { ruleId, severity } = parseItem(value.trim());\n\t\treturn { [ruleId]: severity, ...parsedRules };\n\t}, {});\n}\n","import fs from \"node:fs\";\nimport deepmerge from \"deepmerge\";\nimport prompts from \"prompts\";\nimport { type ConfigData } from \"..\";\n\n/**\n * @public\n */\nexport interface InitResult {\n\tfilename: string;\n}\n\nexport enum Frameworks {\n\tangularjs = \"AngularJS\",\n\tvuejs = \"Vue.js\",\n\tmarkdown = \"Markdown\",\n}\n\nconst frameworkConfig: Record<string, ConfigData> = {\n\t[Frameworks.angularjs]: {\n\t\ttransform: {\n\t\t\t\"^.*\\\\.js$\": \"html-validate-angular/js\",\n\t\t\t\"^.*\\\\.html$\": \"html-validate-angular/html\",\n\t\t},\n\t},\n\t[Frameworks.vuejs]: {\n\t\tplugins: [\"html-validate-vue\"],\n\t\textends: [\"html-validate-vue:recommended\"],\n\t\ttransform: {\n\t\t\t\"^.*\\\\.vue$\": \"html-validate-vue\",\n\t\t},\n\t},\n\t[Frameworks.markdown]: {\n\t\ttransform: {\n\t\t\t\"^.*\\\\.md$\": \"html-validate-markdown\",\n\t\t},\n\t},\n};\n\nfunction addFrameworks(src: ConfigData, frameworks: string[]): ConfigData {\n\tlet config = src;\n\tfor (const framework of frameworks) {\n\t\tconfig = deepmerge(config, frameworkConfig[framework]);\n\t}\n\treturn config;\n}\n\nfunction writeConfig(dst: string, config: ConfigData): Promise<void> {\n\treturn new Promise((resolve, reject) => {\n\t\tfs.writeFile(dst, JSON.stringify(config, null, 2), (err) => {\n\t\t\tif (err) {\n\t\t\t\treject(err);\n\t\t\t}\n\t\t\tresolve();\n\t\t});\n\t});\n}\n\nexport async function init(cwd: string): Promise<InitResult> {\n\tconst filename = `${cwd}/.htmlvalidate.json`;\n\tconst exists = fs.existsSync(filename);\n\tconst initialConfig: ConfigData = {\n\t\telements: [\"html5\"],\n\t\textends: [\"html-validate:recommended\"],\n\t};\n\n\t/* confirm overwrite */\n\tif (exists) {\n\t\tconst result = await prompts({\n\t\t\tname: \"overwrite\",\n\t\t\ttype: \"confirm\",\n\t\t\tmessage: \"A .htmlvalidate.json file already exists, do you want to overwrite it?\",\n\t\t});\n\t\tif (!result.overwrite) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors, unicorn/no-useless-promise-resolve-reject -- technical debt, should not result in failure at all */\n\t\t\treturn Promise.reject();\n\t\t}\n\t}\n\n\tconst questions: prompts.PromptObject[] = [\n\t\t{\n\t\t\tname: \"frameworks\",\n\t\t\ttype: \"multiselect\",\n\t\t\tchoices: [\n\t\t\t\t{ title: Frameworks.angularjs, value: Frameworks.angularjs },\n\t\t\t\t{ title: Frameworks.vuejs, value: Frameworks.vuejs },\n\t\t\t\t{ title: Frameworks.markdown, value: Frameworks.markdown },\n\t\t\t],\n\t\t\tmessage: \"Support additional frameworks?\",\n\t\t},\n\t];\n\n\t/* prompt user for questions */\n\tconst answers = await prompts(questions);\n\n\t/* write configuration to file */\n\tlet config = initialConfig;\n\tconfig = addFrameworks(config, answers[\"frameworks\"] as string[]);\n\tawait writeConfig(filename, config);\n\n\treturn {\n\t\tfilename,\n\t};\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport ignore, { type Ignore } from \"ignore\";\n\nexport class IsIgnored {\n\t/** Cache for parsed .htmlvalidateignore files */\n\tprivate cacheIgnore: Map<string, Ignore | undefined>;\n\n\tpublic constructor() {\n\t\tthis.cacheIgnore = new Map();\n\t}\n\n\t/**\n\t * Searches \".htmlvalidateignore\" files from filesystem and returns `true` if\n\t * one of them contains a pattern matching given filename.\n\t */\n\tpublic isIgnored(filename: string): boolean {\n\t\treturn this.match(filename);\n\t}\n\n\t/**\n\t * Clear cache\n\t */\n\tpublic clearCache(): void {\n\t\tthis.cacheIgnore.clear();\n\t}\n\n\tprivate match(target: string): boolean {\n\t\tlet current = path.dirname(target);\n\n\t\tfor (;;) {\n\t\t\tconst relative = path.relative(current, target);\n\t\t\tconst filename = path.join(current, \".htmlvalidateignore\");\n\n\t\t\t/* test filename (relative to the ignore file) against the patterns */\n\t\t\tconst ig = this.parseFile(filename);\n\t\t\tif (ig?.ignores(relative)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t/* get the parent directory */\n\t\t\tconst child = current;\n\t\t\tcurrent = path.dirname(current);\n\n\t\t\t/* stop if this is the root directory */\n\t\t\tif (current === child) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate parseFile(filename: string): Ignore | undefined {\n\t\tif (this.cacheIgnore.has(filename)) {\n\t\t\treturn this.cacheIgnore.get(filename);\n\t\t}\n\n\t\tif (!fs.existsSync(filename)) {\n\t\t\tthis.cacheIgnore.set(filename, undefined);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst content = fs.readFileSync(filename, \"utf-8\");\n\t\tconst ig = ignore().add(content);\n\t\tthis.cacheIgnore.set(filename, ig);\n\t\treturn ig;\n\t}\n}\n","import path from \"node:path/posix\";\nimport {\n\ttype ConfigData,\n\ttype ConfigLoader,\n\ttype Report,\n\tFileSystemConfigLoader,\n\tHtmlValidate,\n\tUserError,\n\tesmResolver,\n} from \"..\";\nimport { type ExpandOptions, expandFiles } from \"./expand-files\";\nimport { getFormatter } from \"./formatter\";\nimport { getRuleConfig } from \"./get-rule-config\";\nimport { type InitResult, init } from \"./init\";\nimport { IsIgnored } from \"./is-ignored\";\n\nconst resolver = esmResolver();\n\nfunction defaultConfig(preset: string): ConfigData {\n\tconst presets = preset.split(\",\").map((it) => `html-validate:${it}`);\n\treturn {\n\t\textends: presets,\n\t};\n}\n\n/**\n * @public\n */\nexport interface CLIOptions {\n\tconfigFile?: string;\n\t/** Comma-separated list of presets to use */\n\tpreset?: string;\n\trules?: string | string[];\n}\n\nasync function getBaseConfig(preset?: string, filename?: string): Promise<ConfigData> {\n\tif (filename) {\n\t\tconst configData = await resolver.resolveConfig(path.resolve(filename), { cache: false });\n\t\tif (!configData) {\n\t\t\tthrow new UserError(`Failed to read configuration from \"${filename}\"`);\n\t\t}\n\t\treturn configData;\n\t} else {\n\t\treturn defaultConfig(preset ?? \"recommended\");\n\t}\n}\n\n/**\n * @public\n */\nexport class CLI {\n\tprivate options: CLIOptions;\n\tprivate config: ConfigData | null;\n\tprivate loader: ConfigLoader | null;\n\tprivate ignored: IsIgnored;\n\n\t/**\n\t * Create new CLI helper.\n\t *\n\t * Can be used to create tooling with similar properties to bundled CLI\n\t * script.\n\t */\n\tpublic constructor(options?: CLIOptions) {\n\t\tthis.options = options ?? {};\n\t\tthis.config = null;\n\t\tthis.loader = null;\n\t\tthis.ignored = new IsIgnored();\n\t}\n\n\t/**\n\t * Returns list of files matching patterns and are not ignored. Filenames will\n\t * have absolute paths.\n\t *\n\t * @public\n\t */\n\t/* eslint-disable-next-line @typescript-eslint/require-await -- technical debt: expandFiles(..) should actually be async as well */\n\tpublic async expandFiles(patterns: string[], options: ExpandOptions = {}): Promise<string[]> {\n\t\treturn expandFiles(patterns, options).filter((filename) => !this.isIgnored(filename));\n\t}\n\n\tpublic getFormatter(formatters: string): Promise<(report: Report) => string> {\n\t\t/* while not actually async the API boundary returns a Promise in case it needs to in the future, i.e a ESM-based formatter */\n\t\treturn Promise.resolve(getFormatter(formatters));\n\t}\n\n\t/**\n\t * Initialize project with a new configuration.\n\t *\n\t * A new `.htmlvalidate.json` file will be placed in the path provided by\n\t * `cwd`.\n\t */\n\tpublic init(cwd: string): Promise<InitResult> {\n\t\treturn init(cwd);\n\t}\n\n\t/**\n\t * Clear cache.\n\t *\n\t * Previously fetched [[HtmlValidate]] instances must either be fetched again\n\t * or call [[HtmlValidate.flushConfigCache]].\n\t */\n\t/* istanbul ignore next: each method is tested separately */\n\tpublic clearCache(): Promise<void> {\n\t\tif (this.loader) {\n\t\t\tthis.loader.flushCache();\n\t\t}\n\t\tthis.ignored.clearCache();\n\t\treturn Promise.resolve();\n\t}\n\n\t/**\n\t * Get HtmlValidate instance with configuration based on options passed to the\n\t * constructor.\n\t *\n\t * @internal\n\t */\n\tpublic async getLoader(): Promise<ConfigLoader> {\n\t\t/* istanbul ignore next: cache will most likely be cold during testing */\n\t\tif (!this.loader) {\n\t\t\tconst config = await this.getConfig();\n\t\t\tthis.loader = new FileSystemConfigLoader([resolver], config);\n\t\t}\n\t\treturn this.loader;\n\t}\n\n\t/**\n\t * Get HtmlValidate instance with configuration based on options passed to the\n\t * constructor.\n\t *\n\t * @public\n\t */\n\tpublic async getValidator(): Promise<HtmlValidate> {\n\t\tconst loader = await this.getLoader();\n\t\treturn new HtmlValidate(loader);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic async getConfig(): Promise<ConfigData> {\n\t\tthis.config ??= await this.resolveConfig();\n\t\treturn this.config;\n\t}\n\n\t/**\n\t * Searches \".htmlvalidateignore\" files from filesystem and returns `true` if\n\t * one of them contains a pattern matching given filename.\n\t */\n\tprivate isIgnored(filename: string): boolean {\n\t\treturn this.ignored.isIgnored(filename);\n\t}\n\n\tprivate async resolveConfig(): Promise<ConfigData> {\n\t\tconst { options } = this;\n\t\tconst havePreset = Boolean(options.preset);\n\t\tconst haveConfig = Boolean(options.configFile);\n\t\tconst config = await getBaseConfig(options.preset, options.configFile);\n\t\tif (options.rules) {\n\t\t\tif (havePreset || haveConfig) {\n\t\t\t\t/* when rules are explicitly specified and combined with an explicit\n\t\t\t\t * preset or configuration file we merge the result as the user would\n\t\t\t\texpect rules from the preset or configuration files to be used */\n\t\t\t\tconfig.rules = { ...config.rules, ...getRuleConfig(options.rules) };\n\t\t\t} else {\n\t\t\t\t/* if neither an explicit configuration file or preset is passed as a\n\t\t\t\t * CLI argument a default configuration is loaded but since the user has\n\t\t\t\t * specified one or more rules explicitly we overwrite both the default\n\t\t\t\t * preset and the default rules with the explicit rules */\n\t\t\t\tconfig.extends = [];\n\t\t\t\tconfig.rules = getRuleConfig(options.rules);\n\t\t\t}\n\t\t}\n\t\treturn config;\n\t}\n}\n","import { type EventDump, type Location } from \"..\";\n\nconst jsonIgnored = new Set([\n\t\"annotation\",\n\t\"blockedRules\",\n\t\"cache\",\n\t\"closed\",\n\t\"depth\",\n\t\"disabledRules\",\n\t\"nodeType\",\n\t\"unique\",\n\t\"voidElement\",\n]);\nconst jsonFiltered = new Set([\n\t\"childNodes\",\n\t\"children\",\n\t\"data\",\n\t\"meta\",\n\t\"metaElement\",\n\t\"originalData\",\n\t\"parent\",\n]);\n\nfunction isLocation(key: string, value: unknown): value is Location {\n\treturn Boolean(value && (key === \"location\" || key.endsWith(\"Location\")));\n}\n\nfunction isIgnored(key: string): boolean {\n\treturn key.startsWith(\"_\") || jsonIgnored.has(key);\n}\n\nfunction isFiltered(key: string, value: unknown): boolean {\n\treturn Boolean(value && jsonFiltered.has(key));\n}\n\nexport function eventReplacer<T>(this: void, key: string, value: T): T | string | undefined {\n\tif (isLocation(key, value)) {\n\t\tconst filename = value.filename;\n\t\tconst line = String(value.line);\n\t\tconst column = String(value.column);\n\t\treturn `${filename}:${line}:${column}`;\n\t}\n\tif (isIgnored(key)) {\n\t\treturn undefined;\n\t}\n\tif (isFiltered(key, value)) {\n\t\treturn \"[truncated]\";\n\t}\n\treturn value;\n}\n\nexport function eventFormatter(entry: EventDump): string {\n\tconst strdata = JSON.stringify(entry.data, eventReplacer, 2);\n\treturn `${entry.event}: ${strdata}`;\n}\n","/**\n * @internal\n */\nexport enum Mode {\n\tLINT,\n\tINIT,\n\tDUMP_EVENTS,\n\tDUMP_TOKENS,\n\tDUMP_TREE,\n\tDUMP_SOURCE,\n\tPRINT_CONFIG,\n}\n\n/**\n * @internal\n */\nexport function modeToFlag(mode: Mode.LINT): null;\nexport function modeToFlag(mode: Exclude<Mode, Mode.LINT>): string;\nexport function modeToFlag(mode: Mode): string | null;\nexport function modeToFlag(mode: Mode): string | null {\n\tswitch (mode) {\n\t\tcase Mode.LINT:\n\t\t\treturn null;\n\t\tcase Mode.INIT:\n\t\t\treturn \"--init\";\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\treturn \"--dump-events\";\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\treturn \"--dump-tokens\";\n\t\tcase Mode.DUMP_TREE:\n\t\t\treturn \"--dump-tree\";\n\t\tcase Mode.DUMP_SOURCE:\n\t\t\treturn \"--dump-source\";\n\t\tcase Mode.PRINT_CONFIG:\n\t\t\treturn \"--print-config\";\n\t}\n}\n","import { type HtmlValidate, type TokenDump } from \"../..\";\nimport { eventFormatter } from \"../json\";\nimport { Mode } from \"../mode\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport async function dump(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n\tmode: Mode,\n): Promise<boolean> {\n\tlet lines: Array<Promise<string[]>>;\n\tswitch (mode) {\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\tlines = files.map(async (filename: string) => {\n\t\t\t\tconst lines = await htmlvalidate.dumpEvents(filename);\n\t\t\t\treturn lines.map(eventFormatter);\n\t\t\t});\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\tlines = files.map(async (filename: string) => {\n\t\t\t\tconst lines = await htmlvalidate.dumpTokens(filename);\n\t\t\t\treturn lines.map((entry: TokenDump) => {\n\t\t\t\t\tconst data = JSON.stringify(entry.data);\n\t\t\t\t\treturn `TOKEN: ${entry.token}\\n Data: ${data}\\n Location: ${entry.location}`;\n\t\t\t\t});\n\t\t\t});\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TREE:\n\t\t\tlines = files.map((filename: string) => htmlvalidate.dumpTree(filename));\n\t\t\tbreak;\n\t\tcase Mode.DUMP_SOURCE:\n\t\t\tlines = files.map((filename: string) => htmlvalidate.dumpSource(filename));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow new Error(`Unknown mode \"${String(mode)}\"`);\n\t}\n\tconst results = await Promise.all(lines);\n\tconst flat = results.flat();\n\toutput.write(flat.join(\"\\n\"));\n\toutput.write(\"\\n\");\n\treturn true;\n}\n","import { type CLI } from \"../cli\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport interface InitOptions {\n\tcwd: string;\n}\n\nexport async function init(\n\tcli: CLI,\n\toutput: WritableStreamLike,\n\toptions: InitOptions,\n): Promise<boolean> {\n\tconst result = await cli.init(options.cwd);\n\toutput.write(`Configuration written to \"${result.filename}\"\\n`);\n\treturn true;\n}\n","import kleur from \"kleur\";\nimport { type HtmlValidate, type Report, type Result, Reporter } from \"../..\";\nimport { type PerformanceResult } from \"../../performance\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport interface LintOptions {\n\tformatter: (report: Report) => string;\n\tmaxWarnings: number;\n\tperformance: boolean;\n\tstdinFilename: false | string;\n}\nfunction formatMs(ms: number): string {\n\treturn `${ms.toFixed(2)}ms`;\n}\n\nfunction formatPerformanceTable(\n\tnameHeader: string,\n\tentries: Array<{ name: string; count: number; time: number }>,\n\ttotalTime: number,\n): string {\n\tconst nameWidth = Math.max(nameHeader.length, ...entries.map((e) => e.name.length)) + 2;\n\tconst countWidth = Math.max(5, ...entries.map((e) => String(e.count).length)) + 2;\n\tconst header = ` ${nameHeader.padEnd(nameWidth)}${\"count\".padStart(countWidth)} ${\"time(ms)\".padStart(10)} ${\"time(%)\".padStart(8)}`;\n\tconst separator = ` ${\"─\".repeat(header.length - 2)}`;\n\tconst rows = entries.map((entry) => {\n\t\tconst pct = totalTime > 0 ? ((entry.time / totalTime) * 100).toFixed(1) : \"0.0\";\n\t\tconst pctStr = `${pct}%`;\n\t\treturn ` ${entry.name.padEnd(nameWidth)}${String(entry.count).padStart(countWidth)} ${formatMs(entry.time).padStart(10)} ${pctStr.padStart(8)}`;\n\t});\n\treturn [header, separator, ...rows].join(\"\\n\");\n}\n\nfunction formatPerformanceResult(result: PerformanceResult): string {\n\tconst totalEventTime = result.events.reduce((sum, e) => sum + e.time, 0);\n\tconst totalRuleTime = result.rules.reduce((sum, e) => sum + e.time, 0);\n\tconst { configTime, transformTime, totalTime } = result;\n\tconst eventEntries = result.events.map((e) => ({ name: e.event, count: e.count, time: e.time }));\n\tconst ruleEntries = result.rules.map((e) => ({ name: e.rule, count: e.count, time: e.time }));\n\tconst lines = [\n\t\t\"Performance\",\n\t\t\"\",\n\t\t\"Events:\",\n\t\tformatPerformanceTable(\"event\", eventEntries, totalTime),\n\t\t\"\",\n\t\t\"Rules:\",\n\t\tformatPerformanceTable(\"rule\", ruleEntries, totalTime),\n\t\t\"\",\n\t\t`Total: ${formatMs(totalTime)}`,\n\t\t` Config: ${formatMs(configTime)}`,\n\t\t` Transform: ${formatMs(transformTime)}`,\n\t\t` Events: ${formatMs(totalEventTime - totalRuleTime)}`,\n\t\t` Rules: ${formatMs(totalRuleTime)}`,\n\t\t\"\",\n\t];\n\treturn lines.join(\"\\n\");\n}\n\nfunction renameStdin(report: Report, filename: string): void {\n\tconst stdin = report.results.find((cur: Result) => cur.filePath === \"/dev/stdin\");\n\tif (stdin) {\n\t\tstdin.filePath = filename;\n\t}\n}\n\nexport async function lint(\n\thtmlvalidate: HtmlValidate,\n\tstdout: WritableStreamLike,\n\tstderr: WritableStreamLike,\n\tfiles: string[],\n\toptions: LintOptions,\n): Promise<boolean> {\n\tif (options.performance) {\n\t\thtmlvalidate.startPerformance();\n\t}\n\n\tconst reports: Report[] = [];\n\tfor (const filename of files) {\n\t\ttry {\n\t\t\treports.push(await htmlvalidate.validateFile(filename));\n\t\t} catch (err) {\n\t\t\tconst message = kleur.red(`Validator crashed when parsing \"${filename}\"`);\n\t\t\tstdout.write(`${message}\\n`);\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tconst merged = Reporter.merge(reports);\n\n\t/* rename stdin if an explicit filename was passed */\n\tif (options.stdinFilename) {\n\t\trenameStdin(merged, options.stdinFilename);\n\t}\n\n\tstdout.write(options.formatter(merged));\n\n\tif (options.performance) {\n\t\tconst performanceResult = htmlvalidate.stopPerformance();\n\t\tstderr.write(formatPerformanceResult(performanceResult));\n\t}\n\n\tif (options.maxWarnings >= 0 && merged.warningCount > options.maxWarnings) {\n\t\tstdout.write(\n\t\t\t`\\nhtml-validate found too many warnings (maximum: ${String(options.maxWarnings)}).\\n`,\n\t\t);\n\t\treturn false;\n\t}\n\n\treturn merged.valid;\n}\n","import { type HtmlValidate } from \"../..\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport async function printConfig(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n): Promise<boolean> {\n\tif (files.length > 1) {\n\t\toutput.write(`\\`--print-config\\` expected a single filename but got multiple:\\n\\n`);\n\t\tfor (const filename of files) {\n\t\t\toutput.write(` - ${filename}\\n`);\n\t\t}\n\t\toutput.write(\"\\n\");\n\t\treturn false;\n\t}\n\tconst config = await htmlvalidate.getConfigFor(files[0]);\n\tconst json = JSON.stringify(config.getConfigData(), null, 2);\n\toutput.write(`${json}\\n`);\n\treturn true;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport betterAjvErrors from \"@sidvind/better-ajv-errors\";\nimport kleur from \"kleur\";\nimport { type SchemaValidationError } from \"../../error\";\n\nfunction prettyError(err: SchemaValidationError): string {\n\tlet json: string | undefined;\n\tif (err.filename && fs.existsSync(err.filename)) {\n\t\tjson = fs.readFileSync(err.filename, \"utf-8\");\n\t}\n\treturn betterAjvErrors(err.schema, err.obj, err.errors, {\n\t\tformat: \"cli\",\n\t\tindent: 2,\n\t\tjson,\n\t});\n}\n\n/**\n * @internal\n */\nexport function handleSchemaValidationError(console: Console, err: SchemaValidationError): void {\n\tif (err.filename) {\n\t\tconst filename = path.relative(process.cwd(), err.filename);\n\t\tconsole.error(kleur.red(`A configuration error was found in \"${filename}\":`));\n\t} else {\n\t\tconsole.error(kleur.red(`A configuration error was found:`));\n\t}\n\tconsole.group();\n\t{\n\t\tconsole.error(prettyError(err));\n\t}\n\tconsole.groupEnd();\n}\n","import kleur from \"kleur\";\nimport { engines } from \"../../../package.json\";\nimport { UserError } from \"../../error\";\n\n/**\n * @internal\n */\nexport class ImportResolveMissingError extends UserError {\n\tpublic constructor() {\n\t\tconst message = `import.meta.resolve(..) is not available on this system`;\n\t\tsuper(message);\n\t\tthis.name = \"ImportResolveMissingError\";\n\t}\n\n\tpublic override prettyFormat(): string {\n\t\tconst { message } = this;\n\t\tconst currentVersion = process.version;\n\t\tconst requiredVersion = engines.node\n\t\t\t.split(\"||\")\n\t\t\t.map((it) => `v${it.replace(/^\\D+/, \"\").trim()}`);\n\t\treturn [\n\t\t\tkleur.red(`Error: ${message}.`),\n\t\t\t\"\",\n\t\t\t`Either ensure you are running a supported NodeJS version:`,\n\t\t\t` Current: ${currentVersion}`,\n\t\t\t` Required: ${requiredVersion.join(\", \")} or later`,\n\t\t\t`Or set NODE_OPTIONS=\"--experimental-import-meta-resolve\"`,\n\t\t].join(\"\\n\");\n\t}\n}\n","/**\n * @internal\n */\nexport function haveImportMetaResolve(): boolean {\n\treturn \"resolve\" in import.meta;\n}\n"],"names":["fs","path","globSync","formatterFactory","legacyRequire","UserError","ensureError","fn","deepmerge","init","prompts","ignore","esmResolver","FileSystemConfigLoader","HtmlValidate","Mode","lines","kleur","Reporter","betterAjvErrors","engines"],"mappings":"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"}
@@ -16,9 +16,36 @@ function isConfigData(value) {
16
16
  }
17
17
  class HtmlValidate {
18
18
  configLoader;
19
+ _performanceTracker;
19
20
  constructor(arg) {
20
21
  const [loader, config] = arg instanceof core.ConfigLoader ? [arg, void 0] : [void 0, arg];
21
22
  this.configLoader = loader ?? new core.StaticConfigLoader(config);
23
+ this._performanceTracker = null;
24
+ }
25
+ /**
26
+ * Start recording performance data.
27
+ *
28
+ * When active, performance data is accumulated across all subsequent calls to
29
+ * `validateString()`, `validateFile()` and similar methods until
30
+ * {@link HtmlValidate.stopPerformance} is called.
31
+ *
32
+ * @internal
33
+ */
34
+ startPerformance() {
35
+ this._performanceTracker = new core.PerformanceTracker();
36
+ }
37
+ /**
38
+ * Stop recording performance data and return the result.
39
+ *
40
+ * @internal
41
+ */
42
+ stopPerformance() {
43
+ if (!this._performanceTracker) {
44
+ return { events: [], rules: [], configTime: 0, transformTime: 0, totalTime: 0 };
45
+ }
46
+ const result = this._performanceTracker.getResult();
47
+ this._performanceTracker = null;
48
+ return result;
22
49
  }
23
50
  /* eslint-enable @typescript-eslint/unified-signatures */
24
51
  validateString(str, arg1, arg2, arg3) {
@@ -58,11 +85,17 @@ class HtmlValidate {
58
85
  * @returns Report output.
59
86
  */
60
87
  async validateSource(input, configOverride) {
88
+ const tracker = this._performanceTracker;
61
89
  const source = core.normalizeSource(input);
90
+ const t0 = performance.now();
62
91
  const config = await this.getConfigFor(source.filename, configOverride);
63
92
  const resolvers = this.configLoader.getResolvers();
93
+ const t1 = performance.now();
94
+ tracker?.trackConfig(t1 - t0);
64
95
  const transformedSource = await core.transformSource(resolvers, config, source);
65
- const engine = new core.Engine(config, core.Parser);
96
+ const t2 = performance.now();
97
+ tracker?.trackTransform(t2 - t1);
98
+ const engine = new core.Engine(config, core.Parser, { tracker });
66
99
  return engine.lint(transformedSource);
67
100
  }
68
101
  /**
@@ -74,10 +107,15 @@ class HtmlValidate {
74
107
  */
75
108
  validateSourceSync(input, configOverride) {
76
109
  const source = core.normalizeSource(input);
110
+ const t0 = performance.now();
77
111
  const config = this.getConfigForSync(source.filename, configOverride);
78
112
  const resolvers = this.configLoader.getResolvers();
113
+ const t1 = performance.now();
114
+ this._performanceTracker?.trackConfig(t1 - t0);
79
115
  const transformedSource = core.transformSourceSync(resolvers, config, source);
80
- const engine = new core.Engine(config, core.Parser);
116
+ const t2 = performance.now();
117
+ this._performanceTracker?.trackTransform(t2 - t1);
118
+ const engine = new core.Engine(config, core.Parser, { tracker: this._performanceTracker });
81
119
  return engine.lint(transformedSource);
82
120
  }
83
121
  /**
@@ -88,10 +126,16 @@ class HtmlValidate {
88
126
  * @returns Report output.
89
127
  */
90
128
  async validateFile(filename, fs) {
129
+ const tracker = this._performanceTracker;
130
+ const t0 = performance.now();
91
131
  const config = await this.getConfigFor(filename);
92
132
  const resolvers = this.configLoader.getResolvers();
133
+ const t1 = performance.now();
134
+ tracker?.trackConfig(t1 - t0);
93
135
  const source = await core.transformFilename(resolvers, config, filename, fs);
94
- const engine = new core.Engine(config, core.Parser);
136
+ const t2 = performance.now();
137
+ tracker?.trackTransform(t2 - t1);
138
+ const engine = new core.Engine(config, core.Parser, { tracker });
95
139
  return engine.lint(source);
96
140
  }
97
141
  /**
@@ -102,10 +146,15 @@ class HtmlValidate {
102
146
  * @returns Report output.
103
147
  */
104
148
  validateFileSync(filename, fs) {
149
+ const t0 = performance.now();
105
150
  const config = this.getConfigForSync(filename);
106
151
  const resolvers = this.configLoader.getResolvers();
152
+ const t1 = performance.now();
153
+ this._performanceTracker?.trackConfig(t1 - t0);
107
154
  const source = core.transformFilenameSync(resolvers, config, filename, fs);
108
- const engine = new core.Engine(config, core.Parser);
155
+ const t2 = performance.now();
156
+ this._performanceTracker?.trackTransform(t2 - t1);
157
+ const engine = new core.Engine(config, core.Parser, { tracker: this._performanceTracker });
109
158
  return engine.lint(source);
110
159
  }
111
160
  /**
@@ -173,7 +222,7 @@ class HtmlValidate {
173
222
  const config = await this.getConfigFor(filename);
174
223
  const resolvers = this.configLoader.getResolvers();
175
224
  const source = await core.transformFilename(resolvers, config, filename, fs);
176
- const engine = new core.Engine(config, core.Parser);
225
+ const engine = new core.Engine(config, core.Parser, { tracker: null });
177
226
  return engine.dumpTokens(source);
178
227
  }
179
228
  /**
@@ -189,7 +238,7 @@ class HtmlValidate {
189
238
  const config = await this.getConfigFor(filename);
190
239
  const resolvers = this.configLoader.getResolvers();
191
240
  const source = await core.transformFilename(resolvers, config, filename, fs);
192
- const engine = new core.Engine(config, core.Parser);
241
+ const engine = new core.Engine(config, core.Parser, { tracker: null });
193
242
  return engine.dumpEvents(source);
194
243
  }
195
244
  /**
@@ -205,7 +254,7 @@ class HtmlValidate {
205
254
  const config = await this.getConfigFor(filename);
206
255
  const resolvers = this.configLoader.getResolvers();
207
256
  const source = await core.transformFilename(resolvers, config, filename, fs);
208
- const engine = new core.Engine(config, core.Parser);
257
+ const engine = new core.Engine(config, core.Parser, { tracker: null });
209
258
  return engine.dumpTree(source);
210
259
  }
211
260
  /**
@@ -278,12 +327,12 @@ class HtmlValidate {
278
327
  }
279
328
  async getContextualDocumentation(message, filenameOrConfig = "inline") {
280
329
  const config = typeof filenameOrConfig === "string" ? await this.getConfigFor(filenameOrConfig) : await filenameOrConfig;
281
- const engine = new core.Engine(config, core.Parser);
330
+ const engine = new core.Engine(config, core.Parser, { tracker: null });
282
331
  return engine.getRuleDocumentation(message);
283
332
  }
284
333
  getContextualDocumentationSync(message, filenameOrConfig = "inline") {
285
334
  const config = typeof filenameOrConfig === "string" ? this.getConfigForSync(filenameOrConfig) : filenameOrConfig;
286
- const engine = new core.Engine(config, core.Parser);
335
+ const engine = new core.Engine(config, core.Parser, { tracker: null });
287
336
  return engine.getRuleDocumentation(message);
288
337
  }
289
338
  /**
@@ -312,7 +361,7 @@ class HtmlValidate {
312
361
  */
313
362
  async getRuleDocumentation(ruleId, config = null, context = null) {
314
363
  const c = config ?? this.getConfigFor("inline");
315
- const engine = new core.Engine(await c, core.Parser);
364
+ const engine = new core.Engine(await c, core.Parser, { tracker: null });
316
365
  return engine.getRuleDocumentation({ ruleId, context });
317
366
  }
318
367
  /**
@@ -341,7 +390,7 @@ class HtmlValidate {
341
390
  */
342
391
  getRuleDocumentationSync(ruleId, config = null, context = null) {
343
392
  const c = config ?? this.getConfigForSync("inline");
344
- const engine = new core.Engine(c, core.Parser);
393
+ const engine = new core.Engine(c, core.Parser, { tracker: null });
345
394
  return engine.getRuleDocumentation({ ruleId, context });
346
395
  }
347
396
  /**