html-validate 8.17.1 → 8.18.1

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.
package/dist/cjs/cli.js CHANGED
@@ -454,9 +454,11 @@ async function lint(htmlvalidate, output, files, options) {
454
454
  }
455
455
  output.write(options.formatter(merged));
456
456
  if (options.maxWarnings >= 0 && merged.warningCount > options.maxWarnings) {
457
- output.write(`
458
- html-validate found too many warnings (maximum: ${options.maxWarnings}).
459
- `);
457
+ output.write(
458
+ `
459
+ html-validate found too many warnings (maximum: ${String(options.maxWarnings)}).
460
+ `
461
+ );
460
462
  return false;
461
463
  }
462
464
  return merged.valid;
@@ -519,7 +521,10 @@ function isFiltered(key, value) {
519
521
  }
520
522
  function eventReplacer(key, value) {
521
523
  if (isLocation(key, value)) {
522
- return `${value.filename}:${value.line}:${value.column}`;
524
+ const filename = value.filename;
525
+ const line = String(value.line);
526
+ const column = String(value.column);
527
+ return `${filename}:${line}:${column}`;
523
528
  }
524
529
  if (isIgnored(key)) {
525
530
  return void 0;
@@ -559,7 +564,7 @@ function dump(htmlvalidate, output, files, mode) {
559
564
  lines = files.map((filename) => htmlvalidate.dumpSource(filename));
560
565
  break;
561
566
  default:
562
- throw new Error(`Unknown mode "${mode}"`);
567
+ throw new Error(`Unknown mode "${String(mode)}"`);
563
568
  }
564
569
  const flat = lines.reduce((s, c) => s.concat(c), []);
565
570
  output.write(flat.join("\n"));
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sources":["../../src/cli/expand-files.ts","../../src/cli/formatter.ts","../../src/cli/is-ignored.ts","../../src/cli/init.ts","../../src/cli/parse-severity.ts","../../src/cli/get-rule-config.ts","../../src/cli/cli.ts","../../src/cli/errors/handle-schema-validation-error.ts","../../src/cli/mode.ts","../../src/cli/actions/lint.ts","../../src/cli/actions/init.ts","../../src/cli/actions/print-config.ts","../../src/cli/json.ts","../../src/cli/actions/dump.ts"],"sourcesContent":["import fs from \"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.sort((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 \"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 fs from \"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\t// eslint-disable-next-line no-constant-condition -- breaks out when filesystem is traversed\n\t\twhile (true) {\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 && 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 fs from \"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) reject(err);\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 -- 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 { Severity } from \"..\";\n\n/**\n * @internal\n */\nexport function parseSeverity(ruleId: string, severity: string): Severity {\n\tswitch (severity) {\n\t\tcase \"off\":\n\t\tcase \"0\":\n\t\t\treturn Severity.DISABLED;\n\t\tcase \"warn\":\n\t\tcase \"1\":\n\t\t\treturn Severity.WARN;\n\t\tcase \"error\":\n\t\tcase \"2\":\n\t\t\treturn Severity.ERROR;\n\t\tdefault:\n\t\t\tthrow new Error(`Invalid severity \"${severity}\" for rule \"${ruleId}\"`);\n\t}\n}\n","import { Severity, type RuleConfig } from \"..\";\nimport { parseSeverity } from \"./parse-severity\";\n\nfunction parseItem(value: string): { ruleId: string; severity: Severity } {\n\tif (value.includes(\":\")) {\n\t\tconst [ruleId, severity] = value.split(\":\", 2);\n\t\treturn { ruleId, severity: parseSeverity(ruleId, severity) };\n\t} else {\n\t\treturn { ruleId: value, severity: Severity.ERROR };\n\t}\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 path from \"node:path\";\nimport {\n\ttype ConfigData,\n\ttype ConfigLoader,\n\ttype Report,\n\tFileSystemConfigLoader,\n\tUserError,\n\tHtmlValidate,\n\tcjsResolver,\n} from \"..\";\nimport { type ExpandOptions, expandFiles } from \"./expand-files\";\nimport { getFormatter } from \"./formatter\";\nimport { IsIgnored } from \"./is-ignored\";\nimport { type InitResult, init } from \"./init\";\nimport { getRuleConfig } from \"./get-rule-config\";\n\nconst defaultConfig: ConfigData = {\n\textends: [\"html-validate:recommended\"],\n};\n\n/**\n * @public\n */\nexport interface CLIOptions {\n\tconfigFile?: string;\n\trules?: string | string[];\n}\n\nfunction getBaseConfig(filename?: string): ConfigData {\n\tif (filename) {\n\t\tconst resolver = cjsResolver();\n\t\tconst configData = 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;\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\tpublic expandFiles(patterns: string[], options: ExpandOptions = {}): string[] {\n\t\treturn expandFiles(patterns, options).filter((filename) => !this.isIgnored(filename));\n\t}\n\n\tpublic getFormatter(formatters: string): (report: Report) => string {\n\t\treturn 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 * 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.ignored.isIgnored(filename);\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(): void {\n\t\tif (this.loader) {\n\t\t\tthis.loader.flushCache();\n\t\t}\n\t\tthis.ignored.clearCache();\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 getLoader(): ConfigLoader {\n\t\tif (!this.loader) {\n\t\t\tthis.loader = new FileSystemConfigLoader(this.getConfig());\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 getValidator(): HtmlValidate {\n\t\tconst loader = this.getLoader();\n\t\treturn new HtmlValidate(loader);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic getConfig(): ConfigData {\n\t\tif (!this.config) {\n\t\t\tthis.config = this.resolveConfig();\n\t\t}\n\t\treturn this.config;\n\t}\n\n\tprivate resolveConfig(): ConfigData {\n\t\tconst { options } = this;\n\t\tconst config = getBaseConfig(options.configFile);\n\t\tif (options.rules) {\n\t\t\tconfig.extends = [];\n\t\t\tconfig.rules = getRuleConfig(options.rules);\n\t\t}\n\t\treturn config;\n\t}\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","/**\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 {\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 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 = files.map(async (filename: string) => {\n\t\ttry {\n\t\t\treturn 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 = await 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(`\\nhtml-validate found too many warnings (maximum: ${options.maxWarnings}).\\n`);\n\t\treturn false;\n\t}\n\n\treturn merged.valid;\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 { 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 { type EventDump, type Location } from \"..\";\n\nconst jsonIgnored = [\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 = [\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 Boolean(key.startsWith(\"_\") || jsonIgnored.includes(key));\n}\n\nfunction isFiltered(key: string, value: unknown): boolean {\n\treturn Boolean(value && jsonFiltered.includes(key));\n}\n\nexport function eventReplacer<T>(this: void, key: string, value: T): T | string | undefined {\n\tif (isLocation(key, value)) {\n\t\treturn `${value.filename}:${value.line}:${value.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","import { type HtmlValidate, type TokenDump } from \"../..\";\nimport { eventFormatter } from \"../json\";\nimport { Mode } from \"../mode\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport function dump(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n\tmode: Mode,\n): Promise<boolean> {\n\tlet lines: string[][] = [];\n\tswitch (mode) {\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\tlines = files.map((filename: string) =>\n\t\t\t\thtmlvalidate.dumpEvents(filename).map(eventFormatter),\n\t\t\t);\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\tlines = files.map((filename: string) =>\n\t\t\t\thtmlvalidate.dumpTokens(filename).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 \"${mode}\"`);\n\t}\n\tconst flat = lines.reduce((s: string[], c: string[]) => s.concat(c), []);\n\toutput.write(flat.join(\"\\n\"));\n\toutput.write(\"\\n\");\n\treturn Promise.resolve(true);\n}\n"],"names":["fs","path","globSync","formatterFactory","legacyRequire","UserError","ensureError","fn","ignore","deepmerge","init","prompts","Severity","cjsResolver","FileSystemConfigLoader","HtmlValidate","betterAjvErrors","kleur","Mode","Reporter"],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sources":["../../src/cli/expand-files.ts","../../src/cli/formatter.ts","../../src/cli/is-ignored.ts","../../src/cli/init.ts","../../src/cli/parse-severity.ts","../../src/cli/get-rule-config.ts","../../src/cli/cli.ts","../../src/cli/errors/handle-schema-validation-error.ts","../../src/cli/mode.ts","../../src/cli/actions/lint.ts","../../src/cli/actions/init.ts","../../src/cli/actions/print-config.ts","../../src/cli/json.ts","../../src/cli/actions/dump.ts"],"sourcesContent":["import fs from \"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.sort((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 \"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 fs from \"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\t// eslint-disable-next-line no-constant-condition -- breaks out when filesystem is traversed\n\t\twhile (true) {\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 && 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 fs from \"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) reject(err);\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 -- 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 { Severity } from \"..\";\n\n/**\n * @internal\n */\nexport function parseSeverity(ruleId: string, severity: string): Severity {\n\tswitch (severity) {\n\t\tcase \"off\":\n\t\tcase \"0\":\n\t\t\treturn Severity.DISABLED;\n\t\tcase \"warn\":\n\t\tcase \"1\":\n\t\t\treturn Severity.WARN;\n\t\tcase \"error\":\n\t\tcase \"2\":\n\t\t\treturn Severity.ERROR;\n\t\tdefault:\n\t\t\tthrow new Error(`Invalid severity \"${severity}\" for rule \"${ruleId}\"`);\n\t}\n}\n","import { Severity, type RuleConfig } from \"..\";\nimport { parseSeverity } from \"./parse-severity\";\n\nfunction parseItem(value: string): { ruleId: string; severity: Severity } {\n\tif (value.includes(\":\")) {\n\t\tconst [ruleId, severity] = value.split(\":\", 2);\n\t\treturn { ruleId, severity: parseSeverity(ruleId, severity) };\n\t} else {\n\t\treturn { ruleId: value, severity: Severity.ERROR };\n\t}\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 path from \"node:path\";\nimport {\n\ttype ConfigData,\n\ttype ConfigLoader,\n\ttype Report,\n\tFileSystemConfigLoader,\n\tUserError,\n\tHtmlValidate,\n\tcjsResolver,\n} from \"..\";\nimport { type ExpandOptions, expandFiles } from \"./expand-files\";\nimport { getFormatter } from \"./formatter\";\nimport { IsIgnored } from \"./is-ignored\";\nimport { type InitResult, init } from \"./init\";\nimport { getRuleConfig } from \"./get-rule-config\";\n\nconst defaultConfig: ConfigData = {\n\textends: [\"html-validate:recommended\"],\n};\n\n/**\n * @public\n */\nexport interface CLIOptions {\n\tconfigFile?: string;\n\trules?: string | string[];\n}\n\nfunction getBaseConfig(filename?: string): ConfigData {\n\tif (filename) {\n\t\tconst resolver = cjsResolver();\n\t\tconst configData = 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;\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\tpublic expandFiles(patterns: string[], options: ExpandOptions = {}): string[] {\n\t\treturn expandFiles(patterns, options).filter((filename) => !this.isIgnored(filename));\n\t}\n\n\tpublic getFormatter(formatters: string): (report: Report) => string {\n\t\treturn 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 * 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.ignored.isIgnored(filename);\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(): void {\n\t\tif (this.loader) {\n\t\t\tthis.loader.flushCache();\n\t\t}\n\t\tthis.ignored.clearCache();\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 getLoader(): ConfigLoader {\n\t\tif (!this.loader) {\n\t\t\tthis.loader = new FileSystemConfigLoader(this.getConfig());\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 getValidator(): HtmlValidate {\n\t\tconst loader = this.getLoader();\n\t\treturn new HtmlValidate(loader);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic getConfig(): ConfigData {\n\t\tif (!this.config) {\n\t\t\tthis.config = this.resolveConfig();\n\t\t}\n\t\treturn this.config;\n\t}\n\n\tprivate resolveConfig(): ConfigData {\n\t\tconst { options } = this;\n\t\tconst config = getBaseConfig(options.configFile);\n\t\tif (options.rules) {\n\t\t\tconfig.extends = [];\n\t\t\tconfig.rules = getRuleConfig(options.rules);\n\t\t}\n\t\treturn config;\n\t}\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","/**\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 {\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 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 = files.map(async (filename: string) => {\n\t\ttry {\n\t\t\treturn 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 = await 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 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 { 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 { type EventDump, type Location } from \"..\";\n\nconst jsonIgnored = [\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 = [\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 Boolean(key.startsWith(\"_\") || jsonIgnored.includes(key));\n}\n\nfunction isFiltered(key: string, value: unknown): boolean {\n\treturn Boolean(value && jsonFiltered.includes(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","import { type HtmlValidate, type TokenDump } from \"../..\";\nimport { eventFormatter } from \"../json\";\nimport { Mode } from \"../mode\";\nimport { type WritableStreamLike } from \"../writable-stream-like\";\n\nexport function dump(\n\thtmlvalidate: HtmlValidate,\n\toutput: WritableStreamLike,\n\tfiles: string[],\n\tmode: Mode,\n): Promise<boolean> {\n\tlet lines: string[][] = [];\n\tswitch (mode) {\n\t\tcase Mode.DUMP_EVENTS:\n\t\t\tlines = files.map((filename: string) =>\n\t\t\t\thtmlvalidate.dumpEvents(filename).map(eventFormatter),\n\t\t\t);\n\t\t\tbreak;\n\t\tcase Mode.DUMP_TOKENS:\n\t\t\tlines = files.map((filename: string) =>\n\t\t\t\thtmlvalidate.dumpTokens(filename).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 flat = lines.reduce((s: string[], c: string[]) => s.concat(c), []);\n\toutput.write(flat.join(\"\\n\"));\n\toutput.write(\"\\n\");\n\treturn Promise.resolve(true);\n}\n"],"names":["fs","path","globSync","formatterFactory","legacyRequire","UserError","ensureError","fn","ignore","deepmerge","init","prompts","Severity","cjsResolver","FileSystemConfigLoader","HtmlValidate","betterAjvErrors","kleur","Mode","Reporter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAIA,MAAM,kBAAA,GAAqB,CAAC,MAAM,CAAA,CAAA;AAkBlC,SAAS,YAAY,QAA2B,EAAA;AAC/C,EAAM,MAAA,EAAA,GAAKA,mBAAG,CAAA,QAAA,CAAS,QAAQ,CAAA,CAAA;AAC/B,EAAA,OAAO,GAAG,WAAY,EAAA,CAAA;AACvB,CAAA;AAEA,SAAS,IAAA,CAAK,MAAc,QAA0B,EAAA;AACrD,EAAI,IAAAC,qBAAA,CAAK,UAAW,CAAA,QAAQ,CAAG,EAAA;AAC9B,IAAO,OAAAA,qBAAA,CAAK,UAAU,QAAQ,CAAA,CAAA;AAAA,GACxB,MAAA;AACN,IAAA,OAAOA,sBAAK,SAAU,CAAAA,qBAAA,CAAK,IAAK,CAAA,IAAA,EAAM,QAAQ,CAAC,CAAA,CAAA;AAAA,GAChD;AACD,CAAA;AAEA,SAAS,iBAAiB,UAA8B,EAAA;AACvD,EAAA,QAAQ,WAAW,MAAQ;AAAA,IAC1B,KAAK,CAAA;AACJ,MAAO,OAAA,MAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,CAAA,KAAA,EAAQ,UAAW,CAAA,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IAC7B;AACC,MAAA,OAAO,CAAS,MAAA,EAAA,UAAA,CAAW,IAAK,CAAA,GAAG,CAAC,CAAA,CAAA,CAAA,CAAA;AAAA,GACtC;AACD,CAAA;AAMgB,SAAA,WAAA,CAAY,UAAoB,OAAkC,EAAA;AACjF,EAAA,MAAM,GAAM,GAAA,OAAA,CAAQ,GAAO,IAAA,OAAA,CAAQ,GAAI,EAAA,CAAA;AACvC,EAAM,MAAA,UAAA,GAAa,QAAQ,UAAc,IAAA,kBAAA,CAAA;AAEzC,EAAA,MAAM,KAAQ,GAAA,QAAA,CAAS,MAAO,CAAA,CAAC,QAAkB,OAAoB,KAAA;AAEpE,IAAA,IAAI,YAAY,GAAK,EAAA;AACpB,MAAA,MAAA,CAAO,KAAK,YAAY,CAAA,CAAA;AACxB,MAAO,OAAA,MAAA,CAAA;AAAA,KACR;AAEA,IAAA,KAAA,MAAW,YAAYC,aAAS,CAAA,OAAA,EAAS,EAAE,GAAA,EAAK,CAAG,EAAA;AAElD,MAAM,MAAA,QAAA,GAAW,IAAK,CAAA,GAAA,EAAK,QAAQ,CAAA,CAAA;AACnC,MAAI,IAAA,WAAA,CAAY,QAAQ,CAAG,EAAA;AAC1B,QAAA,MAAM,GAAM,GAAA,WAAA,CAAY,CAAC,gBAAA,CAAiB,UAAU,CAAC,CAAG,EAAA,EAAE,GAAG,OAAA,EAAS,GAAK,EAAA,QAAA,EAAU,CAAA,CAAA;AACrF,QAAS,MAAA,GAAA,MAAA,CAAO,MAAO,CAAA,GAAA,CAAI,GAAI,CAAA,CAAC,QAAQ,IAAK,CAAA,QAAA,EAAU,GAAG,CAAC,CAAC,CAAA,CAAA;AAC5D,QAAA,SAAA;AAAA,OACD;AAEA,MAAA,MAAA,CAAO,KAAK,QAAQ,CAAA,CAAA;AAAA,KACrB;AAEA,IAAA,OAAO,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA;AAC5B,MAAA,MAAM,EAAK,GAAA,CAAA,CAAE,KAAM,CAAA,GAAG,CAAE,CAAA,MAAA,CAAA;AACxB,MAAA,MAAM,EAAK,GAAA,CAAA,CAAE,KAAM,CAAA,GAAG,CAAE,CAAA,MAAA,CAAA;AACxB,MAAA,IAAI,OAAO,EAAI,EAAA;AACd,QAAA,OAAO,EAAK,GAAA,EAAA,CAAA;AAAA,OACN,MAAA;AACN,QAAO,OAAA,CAAA,GAAI,IAAI,CAAI,GAAA,CAAA,CAAA,CAAA;AAAA,OACpB;AAAA,KACA,CAAA,CAAA;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AAGL,EAAA,OAAO,KAAM,CAAA,IAAA,CAAK,IAAI,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA;AACjC;;AC9EA,SAAS,IAAA,CAAK,WAAsB,GAA4C,EAAA;AAC/E,EAAA,OAAO,CAAC,OAAsB,KAAA;AAC7B,IAAM,MAAA,MAAA,GAAS,UAAU,OAAO,CAAA,CAAA;AAChC,IAAA,IAAI,GAAK,EAAA;AACR,MAAM,MAAA,GAAA,GAAMD,qBAAK,CAAA,OAAA,CAAQ,GAAG,CAAA,CAAA;AAC5B,MAAA,IAAI,CAACD,mBAAA,CAAG,UAAW,CAAA,GAAG,CAAG,EAAA;AACxB,QAAAA,mBAAA,CAAG,SAAU,CAAA,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA,CAAA;AAAA,OACtC;AACA,MAAGA,mBAAA,CAAA,aAAA,CAAc,GAAK,EAAA,MAAA,EAAQ,OAAO,CAAA,CAAA;AACrC,MAAO,OAAA,EAAA,CAAA;AAAA,KACD,MAAA;AACN,MAAO,OAAA,MAAA,CAAA;AAAA,KACR;AAAA,GACD,CAAA;AACD,CAAA;AAEA,SAAS,cAAc,IAAyB,EAAA;AAC/C,EAAM,MAAA,EAAA,GAAKG,kBAAiB,IAAI,CAAA,CAAA;AAChC,EAAA,IAAI,EAAI,EAAA;AACP,IAAO,OAAA,EAAA,CAAA;AAAA,GACR;AAEA,EAAI,IAAA;AACH,IAAA,OAAOC,yBAAc,IAAI,CAAA,CAAA;AAAA,WACjB,KAAgB,EAAA;AACxB,IAAA,MAAM,IAAIC,cAAU,CAAA,CAAA,oBAAA,EAAuB,IAAI,CAAK,CAAA,CAAA,EAAAC,gBAAA,CAAY,KAAK,CAAC,CAAA,CAAA;AAAA,GACvE;AACD,CAAA;AAEO,SAAS,aAAa,UAAgD,EAAA;AAC5E,EAAA,MAAM,KAAyB,UAAW,CAAA,KAAA,CAAM,GAAG,CAAE,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA;AACjE,IAAA,MAAM,CAAC,IAAM,EAAA,GAAG,IAAI,GAAI,CAAA,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AACpC,IAAMC,MAAAA,GAAAA,GAAK,cAAc,IAAI,CAAA,CAAA;AAC7B,IAAO,OAAA,IAAA,CAAKA,KAAI,GAAG,CAAA,CAAA;AAAA,GACnB,CAAA,CAAA;AACD,EAAA,OAAO,CAAC,MAAmB,KAAA;AAC1B,IAAA,OAAO,EACL,CAAA,GAAA,CAAI,CAAC,SAAA,KAAgC,SAAU,CAAA,MAAA,CAAO,OAAO,CAAC,CAC9D,CAAA,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA,CAAA;AAAA,GACZ,CAAA;AACD;;AC7CO,MAAM,SAAU,CAAA;AAAA,EAIf,WAAc,GAAA;AACpB,IAAK,IAAA,CAAA,WAAA,uBAAkB,GAAI,EAAA,CAAA;AAAA,GAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU,QAA2B,EAAA;AAC3C,IAAO,OAAA,IAAA,CAAK,MAAM,QAAQ,CAAA,CAAA;AAAA,GAC3B;AAAA;AAAA;AAAA;AAAA,EAKO,UAAmB,GAAA;AACzB,IAAA,IAAA,CAAK,YAAY,KAAM,EAAA,CAAA;AAAA,GACxB;AAAA,EAEQ,MAAM,MAAyB,EAAA;AACtC,IAAI,IAAA,OAAA,GAAUN,qBAAK,CAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAGjC,IAAA,OAAO,IAAM,EAAA;AACZ,MAAA,MAAM,QAAW,GAAAA,qBAAA,CAAK,QAAS,CAAA,OAAA,EAAS,MAAM,CAAA,CAAA;AAC9C,MAAA,MAAM,QAAW,GAAAA,qBAAA,CAAK,IAAK,CAAA,OAAA,EAAS,qBAAqB,CAAA,CAAA;AAGzD,MAAM,MAAA,EAAA,GAAK,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAClC,MAAA,IAAI,EAAM,IAAA,EAAA,CAAG,OAAQ,CAAA,QAAQ,CAAG,EAAA;AAC/B,QAAO,OAAA,IAAA,CAAA;AAAA,OACR;AAGA,MAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AACd,MAAU,OAAA,GAAAA,qBAAA,CAAK,QAAQ,OAAO,CAAA,CAAA;AAG9B,MAAA,IAAI,YAAY,KAAO,EAAA;AACtB,QAAA,MAAA;AAAA,OACD;AAAA,KACD;AAEA,IAAO,OAAA,KAAA,CAAA;AAAA,GACR;AAAA,EAEQ,UAAU,QAAsC,EAAA;AACvD,IAAA,IAAI,IAAK,CAAA,WAAA,CAAY,GAAI,CAAA,QAAQ,CAAG,EAAA;AACnC,MAAO,OAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,QAAQ,CAAA,CAAA;AAAA,KACrC;AAEA,IAAA,IAAI,CAACD,mBAAA,CAAG,UAAW,CAAA,QAAQ,CAAG,EAAA;AAC7B,MAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,QAAA,EAAU,KAAS,CAAA,CAAA,CAAA;AACxC,MAAO,OAAA,KAAA,CAAA,CAAA;AAAA,KACR;AAEA,IAAA,MAAM,OAAU,GAAAA,mBAAA,CAAG,YAAa,CAAA,QAAA,EAAU,OAAO,CAAA,CAAA;AACjD,IAAA,MAAM,EAAK,GAAAQ,WAAA,EAAS,CAAA,GAAA,CAAI,OAAO,CAAA,CAAA;AAC/B,IAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,QAAA,EAAU,EAAE,CAAA,CAAA;AACjC,IAAO,OAAA,EAAA,CAAA;AAAA,GACR;AACD;;ACnDA,MAAM,eAA8C,GAAA;AAAA,EACnD,CAAC,8BAAuB;AAAA,IACvB,SAAW,EAAA;AAAA,MACV,WAAa,EAAA,0BAAA;AAAA,MACb,aAAe,EAAA,4BAAA;AAAA,KAChB;AAAA,GACD;AAAA,EACA,CAAC,uBAAmB;AAAA,IACnB,OAAA,EAAS,CAAC,mBAAmB,CAAA;AAAA,IAC7B,OAAA,EAAS,CAAC,+BAA+B,CAAA;AAAA,IACzC,SAAW,EAAA;AAAA,MACV,YAAc,EAAA,mBAAA;AAAA,KACf;AAAA,GACD;AAAA,EACA,CAAC,4BAAsB;AAAA,IACtB,SAAW,EAAA;AAAA,MACV,WAAa,EAAA,wBAAA;AAAA,KACd;AAAA,GACD;AACD,CAAA,CAAA;AAEA,SAAS,aAAA,CAAc,KAAiB,UAAkC,EAAA;AACzE,EAAA,IAAI,MAAS,GAAA,GAAA,CAAA;AACb,EAAA,KAAA,MAAW,aAAa,UAAY,EAAA;AACnC,IAAA,MAAA,GAASC,cAAU,CAAA,MAAA,EAAQ,eAAgB,CAAA,SAAS,CAAC,CAAA,CAAA;AAAA,GACtD;AACA,EAAO,OAAA,MAAA,CAAA;AACR,CAAA;AAEA,SAAS,WAAA,CAAY,KAAa,MAAmC,EAAA;AACpE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACvC,IAAGT,mBAAA,CAAA,SAAA,CAAU,KAAK,IAAK,CAAA,SAAA,CAAU,QAAQ,IAAM,EAAA,CAAC,CAAG,EAAA,CAAC,GAAQ,KAAA;AAC3D,MAAI,IAAA,GAAA;AAAK,QAAA,MAAA,CAAO,GAAG,CAAA,CAAA;AACnB,MAAQ,OAAA,EAAA,CAAA;AAAA,KACR,CAAA,CAAA;AAAA,GACD,CAAA,CAAA;AACF,CAAA;AAEA,eAAsBU,OAAK,GAAkC,EAAA;AAC5D,EAAM,MAAA,QAAA,GAAW,GAAG,GAAG,CAAA,mBAAA,CAAA,CAAA;AACvB,EAAM,MAAA,MAAA,GAASV,mBAAG,CAAA,UAAA,CAAW,QAAQ,CAAA,CAAA;AACrC,EAAA,MAAM,aAA4B,GAAA;AAAA,IACjC,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,IAClB,OAAA,EAAS,CAAC,2BAA2B,CAAA;AAAA,GACtC,CAAA;AAGA,EAAA,IAAI,MAAQ,EAAA;AACX,IAAM,MAAA,MAAA,GAAS,MAAMW,wBAAQ,CAAA;AAAA,MAC5B,IAAM,EAAA,WAAA;AAAA,MACN,IAAM,EAAA,SAAA;AAAA,MACN,OAAS,EAAA,wEAAA;AAAA,KACT,CAAA,CAAA;AACD,IAAI,IAAA,CAAC,OAAO,SAAW,EAAA;AAEtB,MAAA,OAAO,QAAQ,MAAO,EAAA,CAAA;AAAA,KACvB;AAAA,GACD;AAEA,EAAA,MAAM,SAAoC,GAAA;AAAA,IACzC;AAAA,MACC,IAAM,EAAA,YAAA;AAAA,MACN,IAAM,EAAA,aAAA;AAAA,MACN,OAAS,EAAA;AAAA,QACR,EAAE,KAAA,EAAO,WAAsB,kBAAA,KAAA,EAAO,WAAqB,kBAAA;AAAA,QAC3D,EAAE,KAAA,EAAO,QAAkB,cAAA,KAAA,EAAO,QAAiB,cAAA;AAAA,QACnD,EAAE,KAAA,EAAO,UAAqB,iBAAA,KAAA,EAAO,UAAoB,iBAAA;AAAA,OAC1D;AAAA,MACA,OAAS,EAAA,gCAAA;AAAA,KACV;AAAA,GACD,CAAA;AAGA,EAAM,MAAA,OAAA,GAAU,MAAMA,wBAAA,CAAQ,SAAS,CAAA,CAAA;AAGvC,EAAA,IAAI,MAAS,GAAA,aAAA,CAAA;AACb,EAAS,MAAA,GAAA,aAAA,CAAc,MAAQ,EAAA,OAAA,CAAQ,UAAsB,CAAA,CAAA;AAC7D,EAAM,MAAA,WAAA,CAAY,UAAU,MAAM,CAAA,CAAA;AAElC,EAAO,OAAA;AAAA,IACN,QAAA;AAAA,GACD,CAAA;AACD;;AChGgB,SAAA,aAAA,CAAc,QAAgB,QAA4B,EAAA;AACzE,EAAA,QAAQ,QAAU;AAAA,IACjB,KAAK,KAAA,CAAA;AAAA,IACL,KAAK,GAAA;AACJ,MAAA,OAAOC,aAAS,CAAA,QAAA,CAAA;AAAA,IACjB,KAAK,MAAA,CAAA;AAAA,IACL,KAAK,GAAA;AACJ,MAAA,OAAOA,aAAS,CAAA,IAAA,CAAA;AAAA,IACjB,KAAK,OAAA,CAAA;AAAA,IACL,KAAK,GAAA;AACJ,MAAA,OAAOA,aAAS,CAAA,KAAA,CAAA;AAAA,IACjB;AACC,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,kBAAA,EAAqB,QAAQ,CAAA,YAAA,EAAe,MAAM,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,GACvE;AACD;;AChBA,SAAS,UAAU,KAAuD,EAAA;AACzE,EAAI,IAAA,KAAA,CAAM,QAAS,CAAA,GAAG,CAAG,EAAA;AACxB,IAAA,MAAM,CAAC,MAAQ,EAAA,QAAQ,IAAI,KAAM,CAAA,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAC7C,IAAA,OAAO,EAAE,MAAQ,EAAA,QAAA,EAAU,aAAc,CAAA,MAAA,EAAQ,QAAQ,CAAE,EAAA,CAAA;AAAA,GACrD,MAAA;AACN,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAO,EAAA,QAAA,EAAUA,cAAS,KAAM,EAAA,CAAA;AAAA,GAClD;AACD,CAAA;AAKO,SAAS,cAAc,MAAuC,EAAA;AACpE,EAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC/B,IAAO,OAAA,aAAA,CAAc,CAAC,MAAM,CAAC,CAAA,CAAA;AAAA,GAC9B;AAEA,EAAA,OAAO,MAAO,CAAA,MAAA,CAAmB,CAAC,WAAA,EAAa,KAAU,KAAA;AACxD,IAAA,MAAM,EAAE,MAAQ,EAAA,QAAA,KAAa,SAAU,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AACnD,IAAA,OAAO,EAAE,CAAC,MAAM,GAAG,QAAA,EAAU,GAAG,WAAY,EAAA,CAAA;AAAA,GAC7C,EAAG,EAAE,CAAA,CAAA;AACN;;ACRA,MAAM,aAA4B,GAAA;AAAA,EACjC,OAAA,EAAS,CAAC,2BAA2B,CAAA;AACtC,CAAA,CAAA;AAUA,SAAS,cAAc,QAA+B,EAAA;AACrD,EAAA,IAAI,QAAU,EAAA;AACb,IAAA,MAAM,WAAWC,sBAAY,EAAA,CAAA;AAC7B,IAAM,MAAA,UAAA,GAAa,QAAS,CAAA,aAAA,CAAcZ,qBAAK,CAAA,OAAA,CAAQ,QAAQ,CAAG,EAAA,EAAE,KAAO,EAAA,KAAA,EAAO,CAAA,CAAA;AAClF,IAAA,IAAI,CAAC,UAAY,EAAA;AAChB,MAAA,MAAM,IAAII,cAAA,CAAU,CAAsC,mCAAA,EAAA,QAAQ,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,KACtE;AACA,IAAO,OAAA,UAAA,CAAA;AAAA,GACD,MAAA;AACN,IAAO,OAAA,aAAA,CAAA;AAAA,GACR;AACD,CAAA;AAKO,MAAM,GAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYT,YAAY,OAAsB,EAAA;AACxC,IAAK,IAAA,CAAA,OAAA,GAAU,WAAW,EAAC,CAAA;AAC3B,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AACd,IAAA,IAAA,CAAK,MAAS,GAAA,IAAA,CAAA;AACd,IAAK,IAAA,CAAA,OAAA,GAAU,IAAI,SAAU,EAAA,CAAA;AAAA,GAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,WAAY,CAAA,QAAA,EAAoB,OAAyB,GAAA,EAAc,EAAA;AAC7E,IAAO,OAAA,WAAA,CAAY,QAAU,EAAA,OAAO,CAAE,CAAA,MAAA,CAAO,CAAC,QAAA,KAAa,CAAC,IAAA,CAAK,SAAU,CAAA,QAAQ,CAAC,CAAA,CAAA;AAAA,GACrF;AAAA,EAEO,aAAa,UAAgD,EAAA;AACnE,IAAA,OAAO,aAAa,UAAU,CAAA,CAAA;AAAA,GAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAK,GAAkC,EAAA;AAC7C,IAAA,OAAOK,OAAK,GAAG,CAAA,CAAA;AAAA,GAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU,QAA2B,EAAA;AAC3C,IAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAAA,GACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,UAAmB,GAAA;AACzB,IAAA,IAAI,KAAK,MAAQ,EAAA;AAChB,MAAA,IAAA,CAAK,OAAO,UAAW,EAAA,CAAA;AAAA,KACxB;AACA,IAAA,IAAA,CAAK,QAAQ,UAAW,EAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,SAA0B,GAAA;AAChC,IAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AACjB,MAAA,IAAA,CAAK,MAAS,GAAA,IAAII,iCAAuB,CAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AAAA,KAC1D;AACA,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAA6B,GAAA;AACnC,IAAM,MAAA,MAAA,GAAS,KAAK,SAAU,EAAA,CAAA;AAC9B,IAAO,OAAA,IAAIC,kBAAa,MAAM,CAAA,CAAA;AAAA,GAC/B;AAAA;AAAA;AAAA;AAAA,EAKO,SAAwB,GAAA;AAC9B,IAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AACjB,MAAK,IAAA,CAAA,MAAA,GAAS,KAAK,aAAc,EAAA,CAAA;AAAA,KAClC;AACA,IAAA,OAAO,IAAK,CAAA,MAAA,CAAA;AAAA,GACb;AAAA,EAEQ,aAA4B,GAAA;AACnC,IAAM,MAAA,EAAE,SAAY,GAAA,IAAA,CAAA;AACpB,IAAM,MAAA,MAAA,GAAS,aAAc,CAAA,OAAA,CAAQ,UAAU,CAAA,CAAA;AAC/C,IAAA,IAAI,QAAQ,KAAO,EAAA;AAClB,MAAA,MAAA,CAAO,UAAU,EAAC,CAAA;AAClB,MAAO,MAAA,CAAA,KAAA,GAAQ,aAAc,CAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,KAC3C;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACR;AACD;;AClJA,SAAS,YAAY,GAAoC,EAAA;AACxD,EAAI,IAAA,IAAA,CAAA;AACJ,EAAA,IAAI,IAAI,QAAY,IAAAf,qBAAA,CAAG,UAAW,CAAA,GAAA,CAAI,QAAQ,CAAG,EAAA;AAChD,IAAA,IAAA,GAAOA,qBAAG,CAAA,YAAA,CAAa,GAAI,CAAA,QAAA,EAAU,OAAO,CAAA,CAAA;AAAA,GAC7C;AACA,EAAA,OAAOgB,iCAAgB,GAAI,CAAA,MAAA,EAAQ,GAAI,CAAA,GAAA,EAAK,IAAI,MAAQ,EAAA;AAAA,IACvD,MAAQ,EAAA,KAAA;AAAA,IACR,MAAQ,EAAA,CAAA;AAAA,IACR,IAAA;AAAA,GACA,CAAA,CAAA;AACF,CAAA;AAKgB,SAAA,2BAAA,CAA4B,SAAkB,GAAkC,EAAA;AAC/F,EAAA,IAAI,IAAI,QAAU,EAAA;AACjB,IAAA,MAAM,WAAWf,qBAAK,CAAA,QAAA,CAAS,QAAQ,GAAI,EAAA,EAAG,IAAI,QAAQ,CAAA,CAAA;AAC1D,IAAA,OAAA,CAAQ,MAAMgB,sBAAM,CAAA,GAAA,CAAI,CAAuC,oCAAA,EAAA,QAAQ,IAAI,CAAC,CAAA,CAAA;AAAA,GACtE,MAAA;AACN,IAAA,OAAA,CAAQ,KAAM,CAAAA,sBAAA,CAAM,GAAI,CAAA,CAAA,gCAAA,CAAkC,CAAC,CAAA,CAAA;AAAA,GAC5D;AACA,EAAA,OAAA,CAAQ,KAAM,EAAA,CAAA;AACd,EAAA;AACC,IAAQ,OAAA,CAAA,KAAA,CAAM,WAAY,CAAA,GAAG,CAAC,CAAA,CAAA;AAAA,GAC/B;AACA,EAAA,OAAA,CAAQ,QAAS,EAAA,CAAA;AAClB;;AC9BY,IAAA,IAAA,qBAAAC,KAAL,KAAA;AACN,EAAAA,KAAA,CAAA,KAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,WAAA,CAAA,GAAA,CAAA,CAAA,GAAA,WAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,GAAA,aAAA,CAAA;AACA,EAAAA,KAAA,CAAA,KAAA,CAAA,cAAA,CAAA,GAAA,CAAA,CAAA,GAAA,cAAA,CAAA;AAPW,EAAAA,OAAAA,KAAAA,CAAAA;AAAA,CAAA,EAAA,IAAA,IAAA,EAAA,EAAA;AAeL,SAAS,WAAW,IAA2B,EAAA;AACrD,EAAA,QAAQ,IAAM;AAAA,IACb,KAAK,CAAA;AACJ,MAAO,OAAA,IAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,QAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,eAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,eAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,aAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,eAAA,CAAA;AAAA,IACR,KAAK,CAAA;AACJ,MAAO,OAAA,gBAAA,CAAA;AAAA,GACT;AACD;;ACzBA,SAAS,WAAA,CAAY,QAAgB,QAAwB,EAAA;AAC5D,EAAM,MAAA,KAAA,GAAQ,OAAO,OAAQ,CAAA,IAAA,CAAK,CAAC,GAAgB,KAAA,GAAA,CAAI,aAAa,YAAY,CAAA,CAAA;AAChF,EAAA,IAAI,KAAO,EAAA;AACV,IAAA,KAAA,CAAM,QAAW,GAAA,QAAA,CAAA;AAAA,GAClB;AACD,CAAA;AAEA,eAAsB,IACrB,CAAA,YAAA,EACA,MACA,EAAA,KAAA,EACA,OACmB,EAAA;AACnB,EAAA,MAAM,OAAU,GAAA,KAAA,CAAM,GAAI,CAAA,OAAO,QAAqB,KAAA;AACrD,IAAI,IAAA;AACH,MAAO,OAAA,MAAM,YAAa,CAAA,YAAA,CAAa,QAAQ,CAAA,CAAA;AAAA,aACvC,GAAK,EAAA;AACb,MAAA,MAAM,OAAU,GAAAD,sBAAA,CAAM,GAAI,CAAA,CAAA,gCAAA,EAAmC,QAAQ,CAAG,CAAA,CAAA,CAAA,CAAA;AACxE,MAAO,MAAA,CAAA,KAAA,CAAM,GAAG,OAAO,CAAA;AAAA,CAAI,CAAA,CAAA;AAC3B,MAAM,MAAA,GAAA,CAAA;AAAA,KACP;AAAA,GACA,CAAA,CAAA;AAED,EAAA,MAAM,MAAS,GAAA,MAAME,aAAS,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAG3C,EAAA,IAAI,QAAQ,aAAe,EAAA;AAC1B,IAAY,WAAA,CAAA,MAAA,EAAQ,QAAQ,aAAa,CAAA,CAAA;AAAA,GAC1C;AAEA,EAAA,MAAA,CAAO,KAAM,CAAA,OAAA,CAAQ,SAAU,CAAA,MAAM,CAAC,CAAA,CAAA;AAEtC,EAAA,IAAI,QAAQ,WAAe,IAAA,CAAA,IAAK,MAAO,CAAA,YAAA,GAAe,QAAQ,WAAa,EAAA;AAC1E,IAAO,MAAA,CAAA,KAAA;AAAA,MACN,CAAA;AAAA,gDAAqD,EAAA,MAAA,CAAO,OAAQ,CAAA,WAAW,CAAC,CAAA;AAAA,CAAA;AAAA,KACjF,CAAA;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACR;AAEA,EAAA,OAAO,MAAO,CAAA,KAAA,CAAA;AACf;;AC3CsB,eAAA,IAAA,CACrB,GACA,EAAA,MAAA,EACA,OACmB,EAAA;AACnB,EAAA,MAAM,MAAS,GAAA,MAAM,GAAI,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA,CAAA;AACzC,EAAO,MAAA,CAAA,KAAA,CAAM,CAA6B,0BAAA,EAAA,MAAA,CAAO,QAAQ,CAAA;AAAA,CAAK,CAAA,CAAA;AAC9D,EAAO,OAAA,IAAA,CAAA;AACR;;ACZsB,eAAA,WAAA,CACrB,YACA,EAAA,MAAA,EACA,KACmB,EAAA;AACnB,EAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACrB,IAAA,MAAA,CAAO,KAAM,CAAA,CAAA;AAAA;AAAA,CAAqE,CAAA,CAAA;AAClF,IAAA,KAAA,MAAW,YAAY,KAAO,EAAA;AAC7B,MAAO,MAAA,CAAA,KAAA,CAAM,OAAO,QAAQ,CAAA;AAAA,CAAI,CAAA,CAAA;AAAA,KACjC;AACA,IAAA,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA;AACjB,IAAO,OAAA,KAAA,CAAA;AAAA,GACR;AACA,EAAA,MAAM,SAAS,MAAM,YAAA,CAAa,YAAa,CAAA,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,OAAO,IAAK,CAAA,SAAA,CAAU,OAAO,aAAc,EAAA,EAAG,MAAM,CAAC,CAAA,CAAA;AAC3D,EAAO,MAAA,CAAA,KAAA,CAAM,GAAG,IAAI,CAAA;AAAA,CAAI,CAAA,CAAA;AACxB,EAAO,OAAA,IAAA,CAAA;AACR;;AClBA,MAAM,WAAc,GAAA;AAAA,EACnB,YAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AACD,CAAA,CAAA;AACA,MAAM,YAAe,GAAA;AAAA,EACpB,YAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AACD,CAAA,CAAA;AAEA,SAAS,UAAA,CAAW,KAAa,KAAmC,EAAA;AACnE,EAAA,OAAO,QAAQ,KAAU,KAAA,GAAA,KAAQ,cAAc,GAAI,CAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA,CAAA;AACzE,CAAA;AAEA,SAAS,UAAU,GAAsB,EAAA;AACxC,EAAO,OAAA,OAAA,CAAQ,IAAI,UAAW,CAAA,GAAG,KAAK,WAAY,CAAA,QAAA,CAAS,GAAG,CAAC,CAAA,CAAA;AAChE,CAAA;AAEA,SAAS,UAAA,CAAW,KAAa,KAAyB,EAAA;AACzD,EAAA,OAAO,OAAQ,CAAA,KAAA,IAAS,YAAa,CAAA,QAAA,CAAS,GAAG,CAAC,CAAA,CAAA;AACnD,CAAA;AAEgB,SAAA,aAAA,CAA6B,KAAa,KAAkC,EAAA;AAC3F,EAAI,IAAA,UAAA,CAAW,GAAK,EAAA,KAAK,CAAG,EAAA;AAC3B,IAAA,MAAM,WAAW,KAAM,CAAA,QAAA,CAAA;AACvB,IAAM,MAAA,IAAA,GAAO,MAAO,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAC9B,IAAM,MAAA,MAAA,GAAS,MAAO,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAClC,IAAA,OAAO,CAAG,EAAA,QAAQ,CAAI,CAAA,EAAA,IAAI,IAAI,MAAM,CAAA,CAAA,CAAA;AAAA,GACrC;AACA,EAAI,IAAA,SAAA,CAAU,GAAG,CAAG,EAAA;AACnB,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACR;AACA,EAAI,IAAA,UAAA,CAAW,GAAK,EAAA,KAAK,CAAG,EAAA;AAC3B,IAAO,OAAA,aAAA,CAAA;AAAA,GACR;AACA,EAAO,OAAA,KAAA,CAAA;AACR,CAAA;AAEO,SAAS,eAAe,KAA0B,EAAA;AACxD,EAAA,MAAM,UAAU,IAAK,CAAA,SAAA,CAAU,KAAM,CAAA,IAAA,EAAM,eAAe,CAAC,CAAA,CAAA;AAC3D,EAAA,OAAO,CAAG,EAAA,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAClC;;ACjDO,SAAS,IACf,CAAA,YAAA,EACA,MACA,EAAA,KAAA,EACA,IACmB,EAAA;AACnB,EAAA,IAAI,QAAoB,EAAC,CAAA;AACzB,EAAA,QAAQ,IAAM;AAAA,IACb,KAAK,IAAK,CAAA,WAAA;AACT,MAAA,KAAA,GAAQ,KAAM,CAAA,GAAA;AAAA,QAAI,CAAC,QAClB,KAAA,YAAA,CAAa,WAAW,QAAQ,CAAA,CAAE,IAAI,cAAc,CAAA;AAAA,OACrD,CAAA;AACA,MAAA,MAAA;AAAA,IACD,KAAK,IAAK,CAAA,WAAA;AACT,MAAA,KAAA,GAAQ,KAAM,CAAA,GAAA;AAAA,QAAI,CAAC,aAClB,YAAa,CAAA,UAAA,CAAW,QAAQ,CAAE,CAAA,GAAA,CAAI,CAAC,KAAqB,KAAA;AAC3D,UAAA,MAAM,IAAO,GAAA,IAAA,CAAK,SAAU,CAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AACtC,UAAO,OAAA,CAAA,OAAA,EAAU,MAAM,KAAK,CAAA;AAAA,QAAA,EAAa,IAAI,CAAA;AAAA,YAAA,EAAiB,MAAM,QAAQ,CAAA,CAAA,CAAA;AAAA,SAC5E,CAAA;AAAA,OACF,CAAA;AACA,MAAA,MAAA;AAAA,IACD,KAAK,IAAK,CAAA,SAAA;AACT,MAAA,KAAA,GAAQ,MAAM,GAAI,CAAA,CAAC,aAAqB,YAAa,CAAA,QAAA,CAAS,QAAQ,CAAC,CAAA,CAAA;AACvE,MAAA,MAAA;AAAA,IACD,KAAK,IAAK,CAAA,WAAA;AACT,MAAA,KAAA,GAAQ,MAAM,GAAI,CAAA,CAAC,aAAqB,YAAa,CAAA,UAAA,CAAW,QAAQ,CAAC,CAAA,CAAA;AACzE,MAAA,MAAA;AAAA,IACD;AACC,MAAA,MAAM,IAAI,KAAM,CAAA,CAAA,cAAA,EAAiB,MAAO,CAAA,IAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,GAClD;AACA,EAAM,MAAA,IAAA,GAAO,KAAM,CAAA,MAAA,CAAO,CAAC,CAAA,EAAa,CAAgB,KAAA,CAAA,CAAE,MAAO,CAAA,CAAC,CAAG,EAAA,EAAE,CAAA,CAAA;AACvE,EAAA,MAAA,CAAO,KAAM,CAAA,IAAA,CAAK,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA;AAC5B,EAAA,MAAA,CAAO,MAAM,IAAI,CAAA,CAAA;AACjB,EAAO,OAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAA;AAC5B;;;;;;;;;;;"}
package/dist/cjs/core.js CHANGED
@@ -414,6 +414,7 @@ class NestedError extends Error {
414
414
  Error.captureStackTrace(this, NestedError);
415
415
  this.name = NestedError.name;
416
416
  if (nested == null ? void 0 : nested.stack) {
417
+ this.stack ??= "";
417
418
  this.stack += `
418
419
  Caused by: ${nested.stack}`;
419
420
  }
@@ -2321,8 +2322,8 @@ var NodeClosed = /* @__PURE__ */ ((NodeClosed2) => {
2321
2322
  function isElementNode(node) {
2322
2323
  return Boolean(node && node.nodeType === NodeType.ELEMENT_NODE);
2323
2324
  }
2324
- function isValidTagName(tagName) {
2325
- return Boolean(tagName !== "" && tagName !== "*");
2325
+ function isInvalidTagName(tagName) {
2326
+ return Boolean(tagName === "" || tagName === "*");
2326
2327
  }
2327
2328
  function createAdapter(node) {
2328
2329
  return {
@@ -2343,8 +2344,8 @@ class HtmlElement extends DOMNode {
2343
2344
  constructor(tagName, parent, closed, meta, location) {
2344
2345
  const nodeType = tagName ? NodeType.ELEMENT_NODE : NodeType.DOCUMENT_NODE;
2345
2346
  super(nodeType, tagName, location);
2346
- if (!isValidTagName(tagName)) {
2347
- throw new Error(`The tag name provided ('${tagName}') is not a valid name`);
2347
+ if (isInvalidTagName(tagName)) {
2348
+ throw new Error(`The tag name provided ("${tagName}") is not a valid name`);
2348
2349
  }
2349
2350
  this.tagName = tagName ?? "#document";
2350
2351
  this.parent = parent ?? null;
@@ -2471,7 +2472,7 @@ class HtmlElement extends DOMNode {
2471
2472
  parts.push(cur.tagName.toLowerCase());
2472
2473
  continue;
2473
2474
  }
2474
- parts.push(`${cur.tagName.toLowerCase()}:nth-child(${index + 1})`);
2475
+ parts.push(`${cur.tagName.toLowerCase()}:nth-child(${String(index + 1)})`);
2475
2476
  }
2476
2477
  return parts.reverse().join(" > ");
2477
2478
  }
@@ -3308,7 +3309,7 @@ function parseSeverity(value) {
3308
3309
  case "error":
3309
3310
  return 2 /* ERROR */;
3310
3311
  default:
3311
- throw new Error(`Invalid severity "${value}"`);
3312
+ throw new Error(`Invalid severity "${String(value)}"`);
3312
3313
  }
3313
3314
  }
3314
3315
 
@@ -5248,11 +5249,21 @@ class AttributeMisuse extends Rule {
5248
5249
  function parsePattern(pattern) {
5249
5250
  switch (pattern) {
5250
5251
  case "kebabcase":
5251
- return { regexp: /^[a-z0-9-]+$/, description: pattern };
5252
+ return { regexp: /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/, description: pattern };
5252
5253
  case "camelcase":
5253
- return { regexp: /^[a-z][a-zA-Z0-9]+$/, description: pattern };
5254
+ return { regexp: /^[a-z][a-zA-Z0-9]*$/, description: pattern };
5255
+ case "snakecase":
5254
5256
  case "underscore":
5255
- return { regexp: /^[a-z0-9_]+$/, description: pattern };
5257
+ return { regexp: /^[a-z][a-z0-9]*(?:_[a-z0-9]+)*$/, description: pattern };
5258
+ case "bem": {
5259
+ const block = "[a-z][a-z0-9]*(?:-[a-z0-9]+)*";
5260
+ const element = "(?:__[a-z0-9]+(?:-[a-z0-9]+)*)?";
5261
+ const modifier = "(?:--[a-z0-9]+(?:-[a-z0-9]+)*){0,2}";
5262
+ return {
5263
+ regexp: new RegExp(`^${block}${element}${modifier}$`),
5264
+ description: pattern
5265
+ };
5266
+ }
5256
5267
  default: {
5257
5268
  const regexp = new RegExp(pattern);
5258
5269
  return { regexp, description: regexp.toString() };
@@ -6267,8 +6278,8 @@ class FormDupName extends Rule {
6267
6278
  if (!attr || !haveName(name)) {
6268
6279
  continue;
6269
6280
  }
6270
- const form = control.closest("form") ?? document.root;
6271
- this.validateUniqueName(control, form, attr, name);
6281
+ const group = control.closest("form, template") ?? document.root;
6282
+ this.validateUniqueName(control, group, attr, name);
6272
6283
  }
6273
6284
  for (const control of sharedControls) {
6274
6285
  const attr = control.getAttribute("name");
@@ -6276,13 +6287,13 @@ class FormDupName extends Rule {
6276
6287
  if (!attr || !haveName(name)) {
6277
6288
  continue;
6278
6289
  }
6279
- const form = control.closest("form") ?? document.root;
6280
- this.validateSharedName(control, form, attr, name);
6290
+ const group = control.closest("form, template") ?? document.root;
6291
+ this.validateSharedName(control, group, attr, name);
6281
6292
  }
6282
6293
  });
6283
6294
  }
6284
- validateUniqueName(control, form, attr, name) {
6285
- const elements = this.getUniqueElements(form);
6295
+ validateUniqueName(control, group, attr, name) {
6296
+ const elements = this.getUniqueElements(group);
6286
6297
  const { allowArrayBrackets } = this.options;
6287
6298
  if (allowArrayBrackets) {
6288
6299
  const isarray = name.endsWith("[]");
@@ -6327,9 +6338,9 @@ class FormDupName extends Rule {
6327
6338
  });
6328
6339
  }
6329
6340
  }
6330
- validateSharedName(control, form, attr, name) {
6331
- const uniqueElements = this.getUniqueElements(form);
6332
- const sharedElements = this.getSharedElements(form);
6341
+ validateSharedName(control, group, attr, name) {
6342
+ const uniqueElements = this.getUniqueElements(group);
6343
+ const sharedElements = this.getSharedElements(group);
6333
6344
  const type = control.getAttributeValue("type") ?? "";
6334
6345
  if (uniqueElements.has(name) || sharedElements.has(name) && sharedElements.get(name) !== type) {
6335
6346
  const context = {
@@ -6358,23 +6369,23 @@ class FormDupName extends Rule {
6358
6369
  }
6359
6370
  return meta.formAssociated.listed;
6360
6371
  }
6361
- getUniqueElements(form) {
6362
- const existing = form.cacheGet(UNIQUE_CACHE_KEY);
6372
+ getUniqueElements(group) {
6373
+ const existing = group.cacheGet(UNIQUE_CACHE_KEY);
6363
6374
  if (existing) {
6364
6375
  return existing;
6365
6376
  } else {
6366
6377
  const elements = /* @__PURE__ */ new Map();
6367
- form.cacheSet(UNIQUE_CACHE_KEY, elements);
6378
+ group.cacheSet(UNIQUE_CACHE_KEY, elements);
6368
6379
  return elements;
6369
6380
  }
6370
6381
  }
6371
- getSharedElements(form) {
6372
- const existing = form.cacheGet(SHARED_CACHE_KEY);
6382
+ getSharedElements(group) {
6383
+ const existing = group.cacheGet(SHARED_CACHE_KEY);
6373
6384
  if (existing) {
6374
6385
  return existing;
6375
6386
  } else {
6376
6387
  const elements = /* @__PURE__ */ new Map();
6377
- form.cacheSet(SHARED_CACHE_KEY, elements);
6388
+ group.cacheSet(SHARED_CACHE_KEY, elements);
6378
6389
  return elements;
6379
6390
  }
6380
6391
  }
@@ -6496,25 +6507,29 @@ class HeadingLevel extends Rule {
6496
6507
  }
6497
6508
  const location = sliceLocation(event.location, 1);
6498
6509
  if (root.current > 0) {
6499
- const msg = `Heading level can only increase by one, expected <h${expected}> but got <h${level}>`;
6510
+ const expectedTag = `<h${String(expected)}>`;
6511
+ const actualTag = `<h${String(level)}>`;
6512
+ const msg = `Heading level can only increase by one, expected ${expectedTag} but got ${actualTag}`;
6500
6513
  this.report(event.target, msg, location);
6501
6514
  } else {
6502
6515
  this.checkInitialLevel(event, location, level, expected);
6503
6516
  }
6504
6517
  }
6505
6518
  checkInitialLevel(event, location, level, expected) {
6519
+ const expectedTag = `<h${String(expected)}>`;
6520
+ const actualTag = `<h${String(level)}>`;
6506
6521
  if (this.stack.length === 1) {
6507
- const msg = this.minInitialRank > 1 ? `Initial heading level must be <h${this.minInitialRank}> or higher rank but got <h${level}>` : `Initial heading level must be <h${expected}> but got <h${level}>`;
6522
+ const msg = this.minInitialRank > 1 ? `Initial heading level must be <h${String(this.minInitialRank)}> or higher rank but got ${actualTag}` : `Initial heading level must be ${expectedTag} but got ${actualTag}`;
6508
6523
  this.report(event.target, msg, location);
6509
6524
  } else {
6510
6525
  const prevRoot = this.getPrevRoot();
6511
6526
  const prevRootExpected = prevRoot.current + 1;
6512
6527
  if (level > prevRootExpected) {
6513
6528
  if (expected === prevRootExpected) {
6514
- const msg = `Initial heading level for sectioning root must be <h${expected}> but got <h${level}>`;
6529
+ const msg = `Initial heading level for sectioning root must be ${expectedTag} but got ${actualTag}`;
6515
6530
  this.report(event.target, msg, location);
6516
6531
  } else {
6517
- const msg = `Initial heading level for sectioning root must be between <h${expected}> and <h${prevRootExpected}> but got <h${level}>`;
6532
+ const msg = `Initial heading level for sectioning root must be between ${expectedTag} and <h${String(prevRootExpected)}> but got ${actualTag}`;
6518
6533
  this.report(event.target, msg, location);
6519
6534
  }
6520
6535
  }
@@ -6999,7 +7014,7 @@ class LongTitle extends Rule {
6999
7014
  return;
7000
7015
  const text = node.textContent;
7001
7016
  if (text.length > this.maxlength) {
7002
- this.report(node, `title text cannot be longer than ${this.maxlength} characters`);
7017
+ this.report(node, `title text cannot be longer than ${String(this.maxlength)} characters`);
7003
7018
  }
7004
7019
  });
7005
7020
  }
@@ -7460,6 +7475,7 @@ class NoDupClass extends Rule {
7460
7475
  }
7461
7476
  }
7462
7477
 
7478
+ const CACHE_KEY = Symbol("no-dup-id");
7463
7479
  class NoDupID extends Rule {
7464
7480
  documentation() {
7465
7481
  return {
@@ -7470,7 +7486,6 @@ class NoDupID extends Rule {
7470
7486
  setup() {
7471
7487
  this.on("dom:ready", (event) => {
7472
7488
  const { document } = event;
7473
- const existing = /* @__PURE__ */ new Set();
7474
7489
  const elements = document.querySelectorAll("[id]");
7475
7490
  const relevant = elements.filter(isRelevant$3);
7476
7491
  for (const el of relevant) {
@@ -7479,6 +7494,7 @@ class NoDupID extends Rule {
7479
7494
  continue;
7480
7495
  }
7481
7496
  const id = attr.value.toString();
7497
+ const existing = getExisting(el, document.root);
7482
7498
  if (existing.has(id)) {
7483
7499
  this.report(el, `Duplicate ID "${id}"`, attr.valueLocation);
7484
7500
  }
@@ -7487,6 +7503,16 @@ class NoDupID extends Rule {
7487
7503
  });
7488
7504
  }
7489
7505
  }
7506
+ function getExisting(element, root) {
7507
+ const group = element.closest("template") ?? root;
7508
+ const existing = group.cacheGet(CACHE_KEY);
7509
+ if (existing) {
7510
+ return existing;
7511
+ } else {
7512
+ const existing2 = /* @__PURE__ */ new Set();
7513
+ return group.cacheSet(CACHE_KEY, existing2);
7514
+ }
7515
+ }
7490
7516
  function isRelevant$3(element) {
7491
7517
  const attr = element.getAttribute("id");
7492
7518
  if (!attr) {
@@ -10889,8 +10915,8 @@ class Config {
10889
10915
  return plugins.map((moduleName, index) => {
10890
10916
  if (typeof moduleName !== "string") {
10891
10917
  const plugin = moduleName;
10892
- plugin.name = plugin.name || `:unnamedPlugin@${index + 1}`;
10893
- plugin.originalName = `:unnamedPlugin@${index + 1}`;
10918
+ plugin.name = plugin.name || `:unnamedPlugin@${String(index + 1)}`;
10919
+ plugin.originalName = `:unnamedPlugin@${String(index + 1)}`;
10894
10920
  return plugin;
10895
10921
  }
10896
10922
  try {
@@ -10975,7 +11001,7 @@ class Config {
10975
11001
  const version = fn.api ?? 0;
10976
11002
  if (version !== TRANSFORMER_API.VERSION) {
10977
11003
  throw new ConfigError(
10978
- `Transformer uses API version ${version} but only version ${TRANSFORMER_API.VERSION} is supported`
11004
+ `Transformer uses API version ${String(version)} but only version ${String(TRANSFORMER_API.VERSION)} is supported`
10979
11005
  );
10980
11006
  }
10981
11007
  return {
@@ -11984,10 +12010,13 @@ class Engine {
11984
12010
  for (const src of source) {
11985
12011
  for (const token of lexer.tokenize(src)) {
11986
12012
  const data = token.data[0] ?? "";
12013
+ const filename = token.location.filename;
12014
+ const line = String(token.location.line);
12015
+ const column = String(token.location.column);
11987
12016
  lines.push({
11988
12017
  token: TokenType[token.type],
11989
12018
  data,
11990
- location: `${token.location.filename}:${token.location.line}:${token.location.column}`
12019
+ location: `${filename}:${line}:${column}`
11991
12020
  });
11992
12021
  }
11993
12022
  }
@@ -12489,9 +12518,10 @@ class HtmlValidate {
12489
12518
  const config = this.getConfigForSync(filename);
12490
12519
  const sources = config.transformFilename(filename);
12491
12520
  return sources.reduce((result, source) => {
12492
- result.push(
12493
- `Source ${source.filename}@${source.line}:${source.column} (offset: ${source.offset})`
12494
- );
12521
+ const line = String(source.line);
12522
+ const column = String(source.column);
12523
+ const offset = String(source.offset);
12524
+ result.push(`Source ${source.filename}@${line}:${column} (offset: ${offset})`);
12495
12525
  if (source.transformedBy) {
12496
12526
  result.push("Transformed by:");
12497
12527
  result = result.concat(source.transformedBy.reverse().map((name) => ` - ${name}`));
@@ -12659,7 +12689,7 @@ class HtmlValidate {
12659
12689
  }
12660
12690
 
12661
12691
  const name = "html-validate";
12662
- const version = "8.17.1";
12692
+ const version = "8.18.1";
12663
12693
  const bugs = "https://gitlab.com/html-validate/html-validate/issues/new";
12664
12694
 
12665
12695
  function definePlugin(plugin) {
@@ -13357,7 +13387,7 @@ function pluralize(word, count) {
13357
13387
  }
13358
13388
  function formatFilePath(filePath, line, column) {
13359
13389
  if (line && column) {
13360
- filePath += `:${line}:${column}`;
13390
+ filePath += `:${String(line)}:${String(column)}`;
13361
13391
  }
13362
13392
  return kleur__default.default.green(filePath);
13363
13393
  }
@@ -13417,10 +13447,10 @@ function formatSummary(errors, warnings) {
13417
13447
  const summaryColor = errors > 0 ? "red" : "yellow";
13418
13448
  const summary = [];
13419
13449
  if (errors > 0) {
13420
- summary.push(`${errors} ${pluralize("error", errors)}`);
13450
+ summary.push(`${String(errors)} ${pluralize("error", errors)}`);
13421
13451
  }
13422
13452
  if (warnings > 0) {
13423
- summary.push(`${warnings} ${pluralize("warning", warnings)}`);
13453
+ summary.push(`${String(warnings)} ${pluralize("warning", warnings)}`);
13424
13454
  }
13425
13455
  return kleur__default.default[summaryColor]().bold(`${summary.join(" and ")} found.`);
13426
13456
  }
@@ -13499,7 +13529,9 @@ function textFormatter(results) {
13499
13529
  } else {
13500
13530
  messageType = "warning";
13501
13531
  }
13502
- const location = `${result.filePath}:${message.line}:${message.column}`;
13532
+ const line = String(message.line);
13533
+ const column = String(message.column);
13534
+ const location = `${result.filePath}:${line}:${column}`;
13503
13535
  return `${location}: ${messageType} [${message.ruleId}] ${message.message}
13504
13536
  `;
13505
13537
  }).join("");