html-validate 11.4.0 → 11.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"core-nodejs.js","sources":["../../src/htmlvalidate.nodejs.ts","../../src/utils/require-uncached.ts","../../src/config/resolver/nodejs/determine-root-dir.ts","../../src/config/resolver/nodejs/expand-relative-path.ts","../../src/config/resolver/nodejs/cjs-resolver.ts","../../src/config/resolver/nodejs/import-function.ts","../../src/config/resolver/nodejs/internal-import.ts","../../src/config/resolver/nodejs/esm-resolver.ts","../../src/config/loaders/file-system.ts","../../src/utils/compatibility-check.nodejs.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport { type SchemaObject } from \"ajv\";\nimport { type ConfigData, type ResolvedConfig, ConfigLoader } from \"./config\";\nimport { StaticConfigLoader } from \"./config/loaders/static\";\nimport { type Source, normalizeSource } from \"./context\";\nimport { type SourceHooks } from \"./context/source\";\nimport { type EventDump, type TokenDump, Engine } from \"./engine\";\nimport { UserError } from \"./error\";\nimport { type Message } from \"./message\";\nimport { Parser } from \"./parser\";\nimport { type PerformanceResult, PerformanceTracker } from \"./performance\";\nimport { type Report, Reporter } from \"./reporter\";\nimport { type RuleDocumentation } from \"./rule\";\nimport configurationSchema from \"./schema/config.json\";\nimport {\n\ttype TransformFS,\n\ttransformFilename,\n\ttransformFilenameSync,\n\ttransformSource,\n\ttransformSourceSync,\n} from \"./transform\";\nimport { isThenable } from \"./utils/is-thenable\";\n\nconst defaultFS: TransformFS = {\n\treadFileSync: fs.readFileSync,\n};\n\nfunction isSourceHooks(value: string | SourceHooks | ConfigData | undefined): value is SourceHooks {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\treturn [\"processAttribute\", \"processElement\"].some((key) => key in value);\n}\n\nfunction isConfigData(value: string | SourceHooks | ConfigData | undefined): value is ConfigData {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\treturn ![\"processAttribute\", \"processElement\"].some((key) => key in value);\n}\n\n/**\n * Primary API for using HTML-validate.\n *\n * Provides high-level abstractions for common operations.\n *\n * @public\n */\nexport class HtmlValidate {\n\tprotected configLoader: ConfigLoader;\n\tprivate _performanceTracker: PerformanceTracker | null;\n\n\t/**\n\t * Create a new validator.\n\t *\n\t * @public\n\t * @param configLoader - Use a custom configuration loader.\n\t * @param config - If set it provides the global default configuration. By\n\t * default `Config.defaultConfig()` is used.\n\t */\n\tpublic constructor(config?: ConfigData);\n\tpublic constructor(configLoader: ConfigLoader);\n\tpublic constructor(arg?: ConfigLoader | ConfigData) {\n\t\tconst [loader, config] = arg instanceof ConfigLoader ? [arg, undefined] : [undefined, arg];\n\t\tthis.configLoader = loader ?? new StaticConfigLoader(config);\n\t\tthis._performanceTracker = null;\n\t}\n\n\t/**\n\t * Start recording performance data.\n\t *\n\t * When active, performance data is accumulated across all subsequent calls to\n\t * `validateString()`, `validateFile()` and similar methods until\n\t * {@link HtmlValidate.stopPerformance} is called.\n\t *\n\t * @internal\n\t */\n\tpublic startPerformance(): void {\n\t\tthis._performanceTracker = new PerformanceTracker();\n\t}\n\n\t/**\n\t * Stop recording performance data and return the result.\n\t *\n\t * @internal\n\t */\n\tpublic stopPerformance(): PerformanceResult {\n\t\tif (!this._performanceTracker) {\n\t\t\treturn { events: [], rules: [], configTime: 0, transformTime: 0, totalTime: 0 };\n\t\t}\n\t\tconst result = this._performanceTracker.getResult();\n\t\tthis._performanceTracker = null;\n\t\treturn result;\n\t}\n\n\t/**\n\t * Parse and validate HTML from string.\n\t *\n\t * @public\n\t * @param str - Text to parse.\n\t * @param filename - If set configuration is loaded for given filename.\n\t * @param hooks - Optional hooks (see [[Source]]) for definition.\n\t * @returns Report output.\n\t */\n\t/* eslint-disable @typescript-eslint/unified-signatures -- for easier readability */\n\tpublic validateString(str: string): Promise<Report>;\n\tpublic validateString(str: string, filename: string): Promise<Report>;\n\tpublic validateString(str: string, hooks: SourceHooks): Promise<Report>;\n\tpublic validateString(str: string, options: ConfigData): Promise<Report>;\n\tpublic validateString(str: string, filename: string, hooks: SourceHooks): Promise<Report>;\n\tpublic validateString(str: string, filename: string, options: ConfigData): Promise<Report>;\n\tpublic validateString(\n\t\tstr: string,\n\t\tfilename: string,\n\t\toptions: ConfigData,\n\t\thooks: SourceHooks,\n\t): Promise<Report>;\n\t/* eslint-enable @typescript-eslint/unified-signatures */\n\tpublic validateString(\n\t\tstr: string,\n\t\targ1?: string | SourceHooks | ConfigData,\n\t\targ2?: SourceHooks | ConfigData,\n\t\targ3?: SourceHooks,\n\t): Promise<Report> {\n\t\tconst filename = typeof arg1 === \"string\" ? arg1 : \"inline\";\n\t\tconst options = isConfigData(arg1) ? arg1 : isConfigData(arg2) ? arg2 : undefined; // eslint-disable-line sonarjs/no-nested-conditional -- easier to read than the alternative */\n\t\tconst hooks = isSourceHooks(arg1) ? arg1 : isSourceHooks(arg2) ? arg2 : arg3; // eslint-disable-line sonarjs/no-nested-conditional -- easier to read than the alternative */\n\t\tconst source = {\n\t\t\tdata: str,\n\t\t\tfilename,\n\t\t\tline: 1,\n\t\t\tcolumn: 1,\n\t\t\toffset: 0,\n\t\t\thooks,\n\t\t};\n\t\treturn this.validateSource(source, options);\n\t}\n\n\t/**\n\t * Parse and validate HTML from string.\n\t *\n\t * @public\n\t * @param str - Text to parse.\n\t * @param filename - If set configuration is loaded for given filename.\n\t * @param hooks - Optional hooks (see [[Source]]) for definition.\n\t * @returns Report output.\n\t */\n\t/* eslint-disable @typescript-eslint/unified-signatures -- for easier readability */\n\tpublic validateStringSync(str: string): Report;\n\tpublic validateStringSync(str: string, filename: string): Report;\n\tpublic validateStringSync(str: string, hooks: SourceHooks): Report;\n\tpublic validateStringSync(str: string, options: ConfigData): Report;\n\tpublic validateStringSync(str: string, filename: string, hooks: SourceHooks): Report;\n\tpublic validateStringSync(str: string, filename: string, options: ConfigData): Report;\n\tpublic validateStringSync(\n\t\tstr: string,\n\t\tfilename: string,\n\t\toptions: ConfigData,\n\t\thooks: SourceHooks,\n\t): Report;\n\t/* eslint-enable @typescript-eslint/unified-signatures */\n\tpublic validateStringSync(\n\t\tstr: string,\n\t\targ1?: string | SourceHooks | ConfigData,\n\t\targ2?: SourceHooks | ConfigData,\n\t\targ3?: SourceHooks,\n\t): Report {\n\t\tconst filename = typeof arg1 === \"string\" ? arg1 : \"inline\";\n\t\tconst options = isConfigData(arg1) ? arg1 : isConfigData(arg2) ? arg2 : undefined; // eslint-disable-line sonarjs/no-nested-conditional -- easier to read than the alternative */\n\t\tconst hooks = isSourceHooks(arg1) ? arg1 : isSourceHooks(arg2) ? arg2 : arg3; // eslint-disable-line sonarjs/no-nested-conditional -- easier to read than the alternative */\n\t\tconst source = {\n\t\t\tdata: str,\n\t\t\tfilename,\n\t\t\tline: 1,\n\t\t\tcolumn: 1,\n\t\t\toffset: 0,\n\t\t\thooks,\n\t\t};\n\t\treturn this.validateSourceSync(source, options);\n\t}\n\n\t/**\n\t * Parse and validate HTML from [[Source]].\n\t *\n\t * @public\n\t * @param input - Source to parse.\n\t * @returns Report output.\n\t */\n\tpublic async validateSource(input: Source, configOverride?: ConfigData): Promise<Report> {\n\t\tconst tracker = this._performanceTracker;\n\t\tconst source = normalizeSource(input);\n\t\tconst t0 = performance.now();\n\t\tconst config = await this.getConfigFor(source.filename, configOverride);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst t1 = performance.now();\n\t\ttracker?.trackConfig(t1 - t0);\n\t\tconst transformedSource = await transformSource(resolvers, config, source);\n\t\tconst t2 = performance.now();\n\t\ttracker?.trackTransform(t2 - t1);\n\t\tconst engine = new Engine(config, Parser, { tracker });\n\t\treturn engine.lint(transformedSource);\n\t}\n\n\t/**\n\t * Parse and validate HTML from [[Source]].\n\t *\n\t * @public\n\t * @param input - Source to parse.\n\t * @returns Report output.\n\t */\n\tpublic validateSourceSync(input: Source, configOverride?: ConfigData): Report {\n\t\tconst source = normalizeSource(input);\n\t\tconst t0 = performance.now();\n\t\tconst config = this.getConfigForSync(source.filename, configOverride);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst t1 = performance.now();\n\t\tthis._performanceTracker?.trackConfig(t1 - t0);\n\t\tconst transformedSource = transformSourceSync(resolvers, config, source);\n\t\tconst t2 = performance.now();\n\t\tthis._performanceTracker?.trackTransform(t2 - t1);\n\t\tconst engine = new Engine(config, Parser, { tracker: this._performanceTracker });\n\t\treturn engine.lint(transformedSource);\n\t}\n\n\t/**\n\t * Parse and validate HTML from file.\n\t *\n\t * @public\n\t * @param filename - Filename to read and parse.\n\t * @returns Report output.\n\t */\n\tpublic async validateFile(filename: string, fs: TransformFS = defaultFS): Promise<Report> {\n\t\tconst tracker = this._performanceTracker;\n\t\tconst t0 = performance.now();\n\t\tconst config = await this.getConfigFor(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst t1 = performance.now();\n\t\ttracker?.trackConfig(t1 - t0);\n\t\tconst source = await transformFilename(resolvers, config, filename, fs);\n\t\tconst t2 = performance.now();\n\t\ttracker?.trackTransform(t2 - t1);\n\t\tconst engine = new Engine(config, Parser, { tracker });\n\t\treturn engine.lint(source);\n\t}\n\n\t/**\n\t * Parse and validate HTML from file.\n\t *\n\t * @public\n\t * @param filename - Filename to read and parse.\n\t * @returns Report output.\n\t */\n\tpublic validateFileSync(filename: string, fs: TransformFS = defaultFS): Report {\n\t\tconst t0 = performance.now();\n\t\tconst config = this.getConfigForSync(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst t1 = performance.now();\n\t\tthis._performanceTracker?.trackConfig(t1 - t0);\n\t\tconst source = transformFilenameSync(resolvers, config, filename, fs);\n\t\tconst t2 = performance.now();\n\t\tthis._performanceTracker?.trackTransform(t2 - t1);\n\t\tconst engine = new Engine(config, Parser, { tracker: this._performanceTracker });\n\t\treturn engine.lint(source);\n\t}\n\n\t/**\n\t * Parse and validate HTML from multiple files. Result is merged together to a\n\t * single report.\n\t *\n\t * @param filenames - Filenames to read and parse.\n\t * @returns Report output.\n\t */\n\tpublic async validateMultipleFiles(\n\t\tfilenames: string[],\n\t\tfs: TransformFS = defaultFS,\n\t): Promise<Report> {\n\t\treturn Reporter.merge(filenames.map((filename) => this.validateFile(filename, fs)));\n\t}\n\n\t/**\n\t * Parse and validate HTML from multiple files. Result is merged together to a\n\t * single report.\n\t *\n\t * @param filenames - Filenames to read and parse.\n\t * @returns Report output.\n\t */\n\tpublic validateMultipleFilesSync(filenames: string[], fs: TransformFS = defaultFS): Report {\n\t\treturn Reporter.merge(filenames.map((filename) => this.validateFileSync(filename, fs)));\n\t}\n\n\t/**\n\t * Returns true if the given filename can be validated.\n\t *\n\t * A file is considered to be validatable if the extension is `.html` or if a\n\t * transformer matches the filename.\n\t *\n\t * This is mostly useful for tooling to determine whenever to validate the\n\t * file or not. CLI tools will run on all the given files anyway.\n\t */\n\tpublic async canValidate(filename: string): Promise<boolean> {\n\t\t/* .html is always supported */\n\t\tif (filename.toLowerCase().endsWith(\".html\")) {\n\t\t\treturn true;\n\t\t}\n\n\t\t/* test if there is a matching transformer */\n\t\tconst config = await this.getConfigFor(filename);\n\t\treturn config.canTransform(filename);\n\t}\n\n\t/**\n\t * Returns true if the given filename can be validated.\n\t *\n\t * A file is considered to be validatable if the extension is `.html` or if a\n\t * transformer matches the filename.\n\t *\n\t * This is mostly useful for tooling to determine whenever to validate the\n\t * file or not. CLI tools will run on all the given files anyway.\n\t */\n\tpublic canValidateSync(filename: string): boolean {\n\t\t/* .html is always supported */\n\t\tif (filename.toLowerCase().endsWith(\".html\")) {\n\t\t\treturn true;\n\t\t}\n\n\t\t/* test if there is a matching transformer */\n\t\tconst config = this.getConfigForSync(filename);\n\t\treturn config.canTransform(filename);\n\t}\n\n\t/**\n\t * Tokenize filename and output all tokens.\n\t *\n\t * Using CLI this is enabled with `--dump-tokens`. Mostly useful for\n\t * debugging.\n\t *\n\t * @internal\n\t * @param filename - Filename to tokenize.\n\t */\n\tpublic async dumpTokens(filename: string, fs: TransformFS = defaultFS): Promise<TokenDump[]> {\n\t\tconst config = await this.getConfigFor(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst source = await transformFilename(resolvers, config, filename, fs);\n\t\tconst engine = new Engine(config, Parser, { tracker: null });\n\t\treturn engine.dumpTokens(source);\n\t}\n\n\t/**\n\t * Parse filename and output all events.\n\t *\n\t * Using CLI this is enabled with `--dump-events`. Mostly useful for\n\t * debugging.\n\t *\n\t * @internal\n\t * @param filename - Filename to dump events from.\n\t */\n\tpublic async dumpEvents(filename: string, fs: TransformFS = defaultFS): Promise<EventDump[]> {\n\t\tconst config = await this.getConfigFor(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst source = await transformFilename(resolvers, config, filename, fs);\n\t\tconst engine = new Engine(config, Parser, { tracker: null });\n\t\treturn engine.dumpEvents(source);\n\t}\n\n\t/**\n\t * Parse filename and output DOM tree.\n\t *\n\t * Using CLI this is enabled with `--dump-tree`. Mostly useful for\n\t * debugging.\n\t *\n\t * @internal\n\t * @param filename - Filename to dump DOM tree from.\n\t */\n\tpublic async dumpTree(filename: string, fs: TransformFS = defaultFS): Promise<string[]> {\n\t\tconst config = await this.getConfigFor(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst source = await transformFilename(resolvers, config, filename, fs);\n\t\tconst engine = new Engine(config, Parser, { tracker: null });\n\t\treturn engine.dumpTree(source);\n\t}\n\n\t/**\n\t * Transform filename and output source data.\n\t *\n\t * Using CLI this is enabled with `--dump-source`. Mostly useful for\n\t * debugging.\n\t *\n\t * @internal\n\t * @param filename - Filename to dump source from.\n\t */\n\tpublic async dumpSource(filename: string, fs: TransformFS = defaultFS): Promise<string[]> {\n\t\tconst config = await this.getConfigFor(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst sources = await transformFilename(resolvers, config, filename, fs);\n\t\treturn sources.reduce<string[]>((result: string[], source: Source) => {\n\t\t\tconst line = String(source.line);\n\t\t\tconst column = String(source.column);\n\t\t\tconst offset = String(source.offset);\n\t\t\tresult.push(`Source ${source.filename}@${line}:${column} (offset: ${offset})`);\n\t\t\tif (source.transformedBy) {\n\t\t\t\tresult.push(\"Transformed by:\");\n\t\t\t\tresult = result.concat(source.transformedBy.toReversed().map((name) => ` - ${name}`));\n\t\t\t}\n\t\t\tif (source.hooks && Object.keys(source.hooks).length > 0) {\n\t\t\t\tresult.push(\"Hooks\");\n\t\t\t\tfor (const [key, present] of Object.entries(source.hooks)) {\n\t\t\t\t\tif (present) {\n\t\t\t\t\t\tresult.push(` - ${key}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult.push(\"---\");\n\t\t\tresult = result.concat(source.data.split(\"\\n\"));\n\t\t\tresult.push(\"---\");\n\t\t\treturn result;\n\t\t}, []);\n\t}\n\n\t/**\n\t * Get effective configuration schema.\n\t */\n\tpublic getConfigurationSchema(): Promise<SchemaObject> {\n\t\treturn Promise.resolve(configurationSchema);\n\t}\n\n\t/**\n\t * Get effective metadata element schema.\n\t *\n\t * If a filename is given the configured plugins can extend the\n\t * schema. Filename must not be an existing file or a filetype normally\n\t * handled by html-validate but the path will be used when resolving\n\t * configuration. As a rule-of-thumb, set it to the elements json file.\n\t */\n\tpublic async getElementsSchema(filename?: string): Promise<SchemaObject> {\n\t\tconst config = await this.getConfigFor(filename ?? \"inline\");\n\t\tconst metaTable = config.getMetaTable();\n\t\treturn metaTable.getJSONSchema();\n\t}\n\n\t/**\n\t * Get effective metadata element schema.\n\t *\n\t * If a filename is given the configured plugins can extend the\n\t * schema. Filename must not be an existing file or a filetype normally\n\t * handled by html-validate but the path will be used when resolving\n\t * configuration. As a rule-of-thumb, set it to the elements json file.\n\t */\n\tpublic getElementsSchemaSync(filename?: string): SchemaObject {\n\t\tconst config = this.getConfigForSync(filename ?? \"inline\");\n\t\tconst metaTable = config.getMetaTable();\n\t\treturn metaTable.getJSONSchema();\n\t}\n\n\t/**\n\t * Get contextual documentation for the given rule. Configuration will be\n\t * resolved for given filename.\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * const report = await htmlvalidate.validateFile(\"my-file.html\");\n\t * for (const result of report.results){\n\t * for (const message of result.messages){\n\t * const documentation = await htmlvalidate.getContextualDocumentation(message, result.filePath);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @public\n\t * @since 8.0.0\n\t * @param message - Message reported during validation\n\t * @param filename - Filename used to resolve configuration.\n\t * @returns Contextual documentation or `null` if the rule does not exist.\n\t */\n\tpublic getContextualDocumentation(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tfilename?: string,\n\t): Promise<RuleDocumentation | null>;\n\n\t/**\n\t * Get contextual documentation for the given rule using provided\n\t * configuration.\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * const report = await htmlvalidate.validateFile(\"my-file.html\");\n\t * for (const result of report.results){\n\t * for (const message of result.messages){\n\t * const documentation = await htmlvalidate.getRuleDocumentation(message, result.filePath);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @public\n\t * @since 8.0.0\n\t * @param message - Message reported during validation\n\t * @param config - Configuration to use.\n\t * @returns Contextual documentation or `null` if the rule does not exist.\n\t */\n\tpublic getContextualDocumentation(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tconfig: ResolvedConfig | Promise<ResolvedConfig>,\n\t): Promise<RuleDocumentation | null>;\n\n\tpublic async getContextualDocumentation(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tfilenameOrConfig: ResolvedConfig | Promise<ResolvedConfig> | string = \"inline\",\n\t): Promise<RuleDocumentation | null> {\n\t\tconst config =\n\t\t\ttypeof filenameOrConfig === \"string\"\n\t\t\t\t? await this.getConfigFor(filenameOrConfig)\n\t\t\t\t: await filenameOrConfig;\n\t\tconst engine = new Engine(config, Parser, { tracker: null });\n\t\treturn engine.getRuleDocumentation(message);\n\t}\n\n\t/**\n\t * Get contextual documentation for the given rule. Configuration will be\n\t * resolved for given filename.\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * const report = htmlvalidate.validateFileSync(\"my-file.html\");\n\t * for (const result of report.results){\n\t * for (const message of result.messages){\n\t * const documentation = htmlvalidate.getRuleDocumentationSync(message, result.filePath);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @public\n\t * @since 8.0.0\n\t * @param message - Message reported during validation\n\t * @param filename - Filename used to resolve configuration.\n\t * @returns Contextual documentation or `null` if the rule does not exist.\n\t */\n\tpublic getContextualDocumentationSync(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tfilename?: string,\n\t): RuleDocumentation | null;\n\n\t/**\n\t * Get contextual documentation for the given rule using provided\n\t * configuration.\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * const report = htmlvalidate.validateFileSync(\"my-file.html\");\n\t * for (const result of report.results){\n\t * for (const message of result.messages){\n\t * const documentation = htmlvalidate.getRuleDocumentationSync(message, result.filePath);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @public\n\t * @since 8.0.0\n\t * @param message - Message reported during validation\n\t * @param config - Configuration to use.\n\t * @returns Contextual documentation or `null` if the rule does not exist.\n\t */\n\tpublic getContextualDocumentationSync(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tconfig: ResolvedConfig,\n\t): RuleDocumentation | null;\n\n\tpublic getContextualDocumentationSync(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tfilenameOrConfig: ResolvedConfig | string = \"inline\",\n\t): RuleDocumentation | null {\n\t\tconst config =\n\t\t\ttypeof filenameOrConfig === \"string\"\n\t\t\t\t? this.getConfigForSync(filenameOrConfig)\n\t\t\t\t: filenameOrConfig;\n\t\tconst engine = new Engine(config, Parser, { tracker: null });\n\t\treturn engine.getRuleDocumentation(message);\n\t}\n\n\t/**\n\t * Get contextual documentation for the given rule.\n\t *\n\t * Typical usage:\n\t *\n\t * ```js\n\t * const report = await htmlvalidate.validateFile(\"my-file.html\");\n\t * for (const result of report.results){\n\t * const config = await htmlvalidate.getConfigFor(result.filePath);\n\t * for (const message of result.messages){\n\t * const documentation = await htmlvalidate.getRuleDocumentation(message.ruleId, config, message.context);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @internal\n\t * @deprecated Deprecated since 8.0.0, use [[getContextualDocumentation]] instead.\n\t * @param ruleId - Rule to get documentation for.\n\t * @param config - If set it provides more accurate description by using the\n\t * correct configuration for the file.\n\t * @param context - If set to `Message.context` some rules can provide\n\t * contextual details and suggestions.\n\t */\n\tpublic async getRuleDocumentation(\n\t\truleId: string,\n\t\tconfig: ResolvedConfig | Promise<ResolvedConfig> | null = null,\n\t\tcontext: unknown | null = null,\n\t): Promise<RuleDocumentation | null> {\n\t\tconst c = config ?? this.getConfigFor(\"inline\");\n\t\tconst engine = new Engine(await c, Parser, { tracker: null });\n\t\treturn engine.getRuleDocumentation({ ruleId, context });\n\t}\n\n\t/**\n\t * Get contextual documentation for the given rule.\n\t *\n\t * Typical usage:\n\t *\n\t * ```js\n\t * const report = htmlvalidate.validateFileSync(\"my-file.html\");\n\t * for (const result of report.results){\n\t * const config = htmlvalidate.getConfigForSync(result.filePath);\n\t * for (const message of result.messages){\n\t * const documentation = htmlvalidate.getRuleDocumentationSync(message.ruleId, config, message.context);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @internal\n\t * @deprecated Deprecated since 8.0.0, use [[getContextualDocumentationSync]] instead.\n\t * @param ruleId - Rule to get documentation for.\n\t * @param config - If set it provides more accurate description by using the\n\t * correct configuration for the file.\n\t * @param context - If set to `Message.context` some rules can provide\n\t * contextual details and suggestions.\n\t */\n\tpublic getRuleDocumentationSync(\n\t\truleId: string,\n\t\tconfig: ResolvedConfig | null = null,\n\t\tcontext: unknown | null = null,\n\t): RuleDocumentation | null {\n\t\tconst c = config ?? this.getConfigForSync(\"inline\");\n\t\tconst engine = new Engine(c, Parser, { tracker: null });\n\t\treturn engine.getRuleDocumentation({ ruleId, context });\n\t}\n\n\t/**\n\t * Create a parser configured for given filename.\n\t *\n\t * @internal\n\t * @param source - Source to use.\n\t */\n\tpublic async getParserFor(source: Source): Promise<Parser> {\n\t\tconst config = await this.getConfigFor(source.filename);\n\t\treturn new Parser(config);\n\t}\n\n\t/**\n\t * Get configuration for given filename.\n\t *\n\t * See [[FileSystemConfigLoader]] for details.\n\t *\n\t * @public\n\t * @param filename - Filename to get configuration for.\n\t * @param configOverride - Configuration to apply last.\n\t */\n\tpublic getConfigFor(filename: string, configOverride?: ConfigData): Promise<ResolvedConfig> {\n\t\tconst config = this.configLoader.getConfigFor(filename, configOverride);\n\t\treturn Promise.resolve(config);\n\t}\n\n\t/**\n\t * Get configuration for given filename.\n\t *\n\t * See [[FileSystemConfigLoader]] for details.\n\t *\n\t * @public\n\t * @param filename - Filename to get configuration for.\n\t * @param configOverride - Configuration to apply last.\n\t */\n\tpublic getConfigForSync(filename: string, configOverride?: ConfigData): ResolvedConfig {\n\t\tconst config = this.configLoader.getConfigFor(filename, configOverride);\n\t\tif (isThenable(config)) {\n\t\t\tthrow new UserError(\"Cannot use asynchronous config loader with synchronous api\");\n\t\t}\n\t\treturn config;\n\t}\n\n\t/**\n\t * Get current configuration loader.\n\t *\n\t * @public\n\t * @since %version%\n\t * @returns Current configuration loader.\n\t */\n\t/* istanbul ignore next -- not testing setters/getters */\n\tpublic getConfigLoader(): ConfigLoader {\n\t\treturn this.configLoader;\n\t}\n\n\t/**\n\t * Set configuration loader.\n\t *\n\t * @public\n\t * @since %version%\n\t * @param loader - New configuration loader to use.\n\t */\n\t/* istanbul ignore next -- not testing setters/getters */\n\tpublic setConfigLoader(loader: ConfigLoader): void {\n\t\tthis.configLoader = loader;\n\t}\n\n\t/**\n\t * Flush configuration cache. Clears full cache unless a filename is given.\n\t *\n\t * See [[FileSystemConfigLoader]] for details.\n\t *\n\t * @public\n\t * @param filename - If set, only flush cache for given filename.\n\t */\n\tpublic flushConfigCache(filename?: string): void {\n\t\tthis.configLoader.flushCache(filename);\n\t}\n}\n","/* eslint-disable @typescript-eslint/no-deprecated -- works for now and this will be removed when commonjs support ends */\n\n/**\n * Similar to `require(..)` but removes the cached copy first.\n */\nexport function requireUncached(require: NodeJS.Require, moduleId: string): unknown {\n\tconst filename = require.resolve(moduleId);\n\n\t/* remove references from the parent module to prevent memory leak */\n\tconst m = require.cache[filename];\n\tif (m?.parent) {\n\t\tconst { parent } = m;\n\t\tfor (let i = parent.children.length - 1; i >= 0; i--) {\n\t\t\tif (parent.children[i].id === filename) {\n\t\t\t\tparent.children.splice(i, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* remove old module from cache */\n\t/* eslint-disable-next-line @typescript-eslint/no-dynamic-delete -- needed to perform its function */\n\tdelete require.cache[filename];\n\n\t/* eslint-disable-next-line import-x/no-dynamic-require, security/detect-non-literal-require -- as expected but should be moved to upcoming resolver class */\n\treturn require(filename);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nlet cachedRootDir: string | null = null;\n\ninterface FSLike {\n\texistsSync(path: string): boolean;\n}\n\n/**\n * @internal\n */\nexport function determineRootDirImpl(intial: string, fs: FSLike): string {\n\t/* try to locate package.json */\n\tlet current = intial;\n\n\tfor (;;) {\n\t\tconst search = path.join(current, \"package.json\");\n\t\tif (fs.existsSync(search)) {\n\t\t\treturn current;\n\t\t}\n\n\t\t/* get the parent directory */\n\t\tconst child = current;\n\t\tcurrent = path.dirname(current);\n\n\t\t/* stop if this is the root directory */\n\t\tif (current === child) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* default to working directory if no package.json is found */\n\treturn intial;\n}\n\n/**\n * Try to determine root directory based on the location of the closest\n * `package.json`. Fallbacks on `process.cwd()` if no package.json was found.\n *\n * @internal\n */\n/* istanbul ignore next: cached version of determineRootDirImpl, no need to test */\nexport function determineRootDir(): string {\n\tcachedRootDir ??= determineRootDirImpl(process.cwd(), fs);\n\treturn cachedRootDir;\n}\n","import path from \"node:path\";\n\n/**\n * @internal\n */\nexport function expandRelativePath<T>(value: string | T, { cwd }: { cwd: string }): string | T {\n\tif (typeof value === \"string\" && value.startsWith(\".\")) {\n\t\treturn path.normalize(path.join(cwd, value));\n\t} else {\n\t\treturn value;\n\t}\n}\n","import path from \"node:path\";\nimport { type MetaDataTable } from \"../../../meta\";\nimport { type Plugin } from \"../../../plugin\";\nimport { legacyRequire } from \"../../../resolve\";\nimport { type Transformer } from \"../../../transform\";\nimport { requireUncached } from \"../../../utils/require-uncached\";\nimport { type ConfigData } from \"../../config-data\";\nimport { ConfigError } from \"../../error\";\nimport { type Resolver, type ResolverOptions } from \"../resolver\";\nimport { determineRootDir } from \"./determine-root-dir\";\nimport { expandRelativePath } from \"./expand-relative-path\";\n\n/**\n * @internal\n */\nexport interface RequireError extends Error {\n\tcode: string;\n}\n\nfunction isRequireError(error: unknown): error is RequireError {\n\treturn Boolean(error && typeof error === \"object\" && \"code\" in error);\n}\n\nfunction isTransformer(value: Transformer | Plugin): value is Transformer {\n\treturn typeof value === \"function\";\n}\n\n/**\n * CommonJS resolver.\n *\n * @public\n * @since 8.8.0\n */\nexport type CommonJSResolver = Required<Resolver>;\n\n/**\n * Create a new resolver for NodeJS packages using `require(..)`.\n *\n * If the module name contains `<rootDir>` (e.g. `<rootDir/foo`) it will be\n * expanded relative to the root directory either explicitly set by the\n * `rootDir` parameter or determined automatically by the closest `package.json`\n * file (starting at the current working directory).\n *\n * @public\n * @since 8.8.0\n */\nexport function cjsResolver(options: { rootDir?: string } = {}): CommonJSResolver {\n\tconst rootDir = options.rootDir ?? determineRootDir();\n\n\t/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- technical debt, should return unknown as use explicit cast */\n\tfunction internalRequire<T = unknown>(id: string, { cache }: ResolverOptions): T | null {\n\t\tconst moduleName = id.replace(\"<rootDir>\", rootDir);\n\t\ttry {\n\t\t\t/* istanbul ignore else: the tests only runs the cached versions to get\n\t\t\t * unmodified access to `require`, the implementation of `requireUncached`\n\t\t\t * is assumed to be tested elsewhere */\n\t\t\tif (cache) {\n\t\t\t\treturn legacyRequire(moduleName) as T;\n\t\t\t} else {\n\t\t\t\treturn requireUncached(legacyRequire, moduleName) as T;\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\tif (isRequireError(err) && err.code === \"MODULE_NOT_FOUND\") {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\treturn {\n\t\tname: \"nodejs-resolver\",\n\n\t\tresolveElements(id: string, options: ResolverOptions): MetaDataTable | null {\n\t\t\treturn internalRequire(id, options);\n\t\t},\n\n\t\tresolveConfig(id: string, options: ResolverOptions): ConfigData | null {\n\t\t\tconst configData = internalRequire<ConfigData>(id, options);\n\t\t\tif (!configData) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t/* expand any relative paths */\n\t\t\tconst cwd = path.dirname(id);\n\t\t\tconst expand = <T>(value: string | T): string | T => expandRelativePath(value, { cwd });\n\n\t\t\tif (Array.isArray(configData.elements)) {\n\t\t\t\tconfigData.elements = configData.elements.map(expand);\n\t\t\t}\n\n\t\t\tif (Array.isArray(configData.extends)) {\n\t\t\t\tconfigData.extends = configData.extends.map(expand);\n\t\t\t}\n\n\t\t\tif (Array.isArray(configData.plugins)) {\n\t\t\t\tconfigData.plugins = configData.plugins.map(expand);\n\t\t\t}\n\n\t\t\treturn configData;\n\t\t},\n\n\t\tresolvePlugin(id: string, options: ResolverOptions): Plugin | null {\n\t\t\treturn internalRequire<Plugin>(id, options);\n\t\t},\n\n\t\tresolveTransformer(id: string, options: ResolverOptions): Transformer | null {\n\t\t\tconst mod = internalRequire<Transformer | Plugin>(id, options);\n\t\t\tif (!mod) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (isTransformer(mod)) {\n\t\t\t\treturn mod;\n\t\t\t}\n\n\t\t\t/* this is not a proper transformer, is it a plugin exposing a transformer? */\n\t\t\tif (mod.transformer) {\n\t\t\t\tthrow new ConfigError(\n\t\t\t\t\t`Module \"${id}\" is not a valid transformer. This looks like a plugin, did you forget to load the plugin first?`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow new ConfigError(`Module \"${id}\" is not a valid transformer.`);\n\t\t},\n\t};\n}\n","/* istanbul ignore file: this file is only for easier mocking */\n\n/**\n * Wrapper around import() so we can mock it in unittests.\n *\n * @internal\n */\nexport function importFunction(id: string): unknown {\n\treturn import(id);\n}\n","import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport { UserError } from \"../../../error\";\nimport { importResolve } from \"../../../resolve\";\nimport { type ResolverOptions } from \"../resolver\";\nimport { importFunction } from \"./import-function\";\n\n/**\n * @internal\n */\nexport interface ImportError extends Error {\n\tcode: string;\n\trequireStack?: string[];\n}\n\nasync function getModuleName(\n\tid: string,\n\t{ cache, rootDir }: { cache: boolean; rootDir: string },\n): Promise<URL> {\n\tconst moduleName = id.replace(\"<rootDir>\", rootDir);\n\tconst url = existsSync(id) ? pathToFileURL(id) : importResolve(moduleName);\n\n\tif (url.protocol !== \"file:\") {\n\t\treturn url;\n\t}\n\n\t/* istanbul ignore else: the tests only runs the cached versions */\n\tif (cache) {\n\t\treturn url;\n\t} else {\n\t\t/* Cachebusting in ESM is tricky, we cannot flush the cache of the old import\n\t\t * but a common workaround is to append ?something to the path. It only works\n\t\t * with absolute paths though so we must first use `import.meta.resolve(..)`\n\t\t * which doesn't play nice with CJS. Then we will leak memory each time a\n\t\t * fresh copy is loaded and there doesn't seem to be a way to deal with this\n\t\t * yet. We use the file mtime to at least try to retain the copy as long as\n\t\t * possible but this will fail for transitive imports but at least with\n\t\t * directly loaded configurations it would reload property. */\n\t\tconst stat = await fs.stat(url);\n\t\turl.searchParams.append(\"mtime\", String(stat.mtime.getTime()));\n\t\treturn url;\n\t}\n}\n\nfunction isImportError(error: unknown): error is ImportError {\n\treturn Boolean(error && typeof error === \"object\" && \"code\" in error);\n}\n\n/**\n * @internal\n */\nexport async function internalImport<T = unknown>(\n\tid: string,\n\trootDir: string,\n\t{ cache }: ResolverOptions,\n): Promise<T | null> {\n\t/* this is a workaround for rollup which mangles import attributes so we\n\t * cannot use `import(.., { with: { type: \"json\" } })` to import a json\n\t * file. */\n\t/* istanbul ignore if: workaround, not tested, should be removed if the compiler bug is fixed */\n\tif (id.endsWith(\".json\")) {\n\t\tconst content = await fs.readFile(id, \"utf-8\");\n\t\treturn JSON.parse(content) as T;\n\t}\n\n\ttry {\n\t\tconst url = await getModuleName(id, { cache, rootDir });\n\t\tif (url.protocol !== \"file:\") {\n\t\t\treturn null;\n\t\t}\n\t\tconst moduleName = url.toString();\n\t\tconst { default: defaultImport } = (await importFunction(moduleName)) as { default: T };\n\t\tif (!defaultImport) {\n\t\t\tthrow new UserError(`\"${id}\" does not have a default export`);\n\t\t}\n\t\treturn defaultImport;\n\t} catch (err: unknown) {\n\t\tif (isImportError(err) && err.code === \"MODULE_NOT_FOUND\" && !err.requireStack) {\n\t\t\treturn null;\n\t\t}\n\t\tthrow err;\n\t}\n}\n","import path from \"node:path\";\nimport { type MetaDataTable } from \"../../../meta\";\nimport { type Plugin } from \"../../../plugin\";\nimport { type Transformer } from \"../../../transform\";\nimport { type ConfigData } from \"../../config-data\";\nimport { ConfigError } from \"../../error\";\nimport { type Resolver, type ResolverOptions } from \"../resolver\";\nimport { determineRootDir } from \"./determine-root-dir\";\nimport { expandRelativePath } from \"./expand-relative-path\";\nimport { internalImport } from \"./internal-import\";\n\nfunction isTransformer(value: Transformer | Plugin): value is Transformer {\n\treturn typeof value === \"function\";\n}\n\n/**\n * ESM resolver.\n *\n * @public\n * @since 9.0.0\n */\nexport type ESMResolver = Required<Resolver>;\n\n/**\n * Create a new resolver for NodeJS packages using `import(..)`.\n *\n * If the module name contains `<rootDir>` (e.g. `<rootDir/foo`) it will be\n * expanded relative to the root directory either explicitly set by the\n * `rootDir` parameter or determined automatically by the closest `package.json`\n * file (starting at the current working directory).\n *\n * @public\n * @since 9.0.0\n */\nexport function esmResolver(options: { rootDir?: string } = {}): ESMResolver {\n\tconst rootDir = options.rootDir ?? determineRootDir();\n\n\treturn {\n\t\tname: \"esm-resolver\",\n\n\t\tresolveElements(id: string, options: ResolverOptions): Promise<MetaDataTable | null> {\n\t\t\treturn internalImport(id, rootDir, options);\n\t\t},\n\n\t\tasync resolveConfig(id: string, options: ResolverOptions): Promise<ConfigData | null> {\n\t\t\tconst configData = await internalImport<ConfigData>(id, rootDir, options);\n\t\t\tif (!configData) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t/* expand any relative paths */\n\t\t\tconst cwd = path.dirname(id);\n\t\t\tconst expand = <T>(value: string | T): string | T => expandRelativePath(value, { cwd });\n\n\t\t\tif (Array.isArray(configData.elements)) {\n\t\t\t\tconfigData.elements = configData.elements.map(expand);\n\t\t\t}\n\n\t\t\tif (Array.isArray(configData.extends)) {\n\t\t\t\tconfigData.extends = configData.extends.map(expand);\n\t\t\t}\n\n\t\t\tif (Array.isArray(configData.plugins)) {\n\t\t\t\tconfigData.plugins = configData.plugins.map(expand);\n\t\t\t}\n\n\t\t\treturn configData;\n\t\t},\n\n\t\tresolvePlugin(id: string, options: ResolverOptions): Promise<Plugin | null> {\n\t\t\treturn internalImport<Plugin>(id, rootDir, options);\n\t\t},\n\n\t\tasync resolveTransformer(id: string, options: ResolverOptions): Promise<Transformer | null> {\n\t\t\tconst mod = await internalImport<Transformer | Plugin>(id, rootDir, options);\n\t\t\tif (!mod) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (isTransformer(mod)) {\n\t\t\t\treturn mod;\n\t\t\t}\n\n\t\t\t/* this is not a proper transformer, is it a plugin exposing a transformer? */\n\t\t\tif (mod.transformer) {\n\t\t\t\tthrow new ConfigError(\n\t\t\t\t\t`Module \"${id}\" is not a valid transformer. This looks like a plugin, did you forget to load the plugin first?`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow new ConfigError(`Module \"${id}\" is not a valid transformer.`);\n\t\t},\n\t};\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { isThenable } from \"../../utils/is-thenable\";\nimport { Config } from \"../config\";\nimport { type ConfigData } from \"../config-data\";\nimport { ConfigLoader } from \"../config-loader\";\nimport { type ResolvedConfig } from \"../resolved-config\";\nimport { type Resolver } from \"../resolver\";\nimport { type FSLike, esmResolver } from \"../resolver/nodejs\";\n\n/**\n * Options for [[FileSystemConfigLoader]].\n *\n * @public\n */\nexport interface FileSystemConfigLoaderOptions {\n\t/** An implementation of `fs` as needed by [[FileSystemConfigLoader]] */\n\tfs: FSLike;\n}\n\n/**\n * @internal\n */\nfunction findConfigurationFiles(fs: FSLike, directory: string): string[] {\n\treturn [\"json\", \"mjs\", \"cjs\", \"js\"]\n\t\t.map((extension) => path.join(directory, `.htmlvalidate.${extension}`))\n\t\t.filter((filePath) => fs.existsSync(filePath));\n}\n\n/**\n * Normalize filename for configuration resolution.\n *\n * When reading from stdin (`/dev/stdin`), returns a path based on the current\n * working directory to enable proper configuration file discovery.\n *\n * @internal\n */\nfunction normalizeFilename(filename: string): string {\n\treturn filename === \"/dev/stdin\" ? path.join(process.cwd(), \"noop.html\") : filename;\n}\n\nconst defaultResolvers: Resolver[] = [esmResolver()];\n\ntype ConstructorParametersDefault = [ConfigData?, Partial<FileSystemConfigLoaderOptions>?];\ntype ConstructorParametersResolver = [\n\tResolver[],\n\tConfigData?,\n\tPartial<FileSystemConfigLoaderOptions>?,\n];\ntype ConstructorParameters = ConstructorParametersDefault | ConstructorParametersResolver;\n\nfunction hasResolver(value: ConstructorParameters): value is ConstructorParametersResolver {\n\treturn Array.isArray(value[0]);\n}\n\n/**\n * Loads configuration by traversing filesystem.\n *\n * Configuration is read from three sources and in the following order:\n *\n * 1. Global configuration passed to constructor.\n * 2. Configuration files found when traversing the directory structure.\n * 3. Override passed to this function.\n *\n * The following configuration filenames are searched:\n *\n * - `.htmlvalidate.json`\n * - `.htmlvalidate.js`\n * - `.htmlvalidate.cjs`\n * - `.htmlvalidate.mjs`\n *\n * Global configuration is used when no configuration file is found. The\n * result is always merged with override if present.\n *\n * The `root` property set to `true` affects the configuration as following:\n *\n * 1. If set in override the override is returned as-is.\n * 2. If set in the global config the override is merged into global and\n * returned. No configuration files are searched.\n * 3. Setting `root` in configuration file only stops directory traversal.\n *\n * @public\n */\nexport class FileSystemConfigLoader extends ConfigLoader {\n\tprotected cache: Map<string, Config | null>;\n\tprivate fs: FSLike;\n\n\t/**\n\t * Create a filesystem configuration loader with default resolvers.\n\t *\n\t * @param fs - `fs` implementation,\n\t * @param config - Global configuration.\n\t * @param configFactory - Optional configuration factory.\n\t */\n\tpublic constructor(config?: ConfigData, options?: Partial<FileSystemConfigLoaderOptions>);\n\n\t/**\n\t * Create a filesystem configuration loader with custom resolvers.\n\t *\n\t * @param fs - `fs` implementation,\n\t * @param resolvers - Resolvers to use.\n\t * @param config - Global configuration.\n\t * @param configFactory - Optional configuration factory.\n\t */\n\tpublic constructor(\n\t\tresolvers: Resolver[],\n\t\tconfig?: ConfigData,\n\t\toptions?: Partial<FileSystemConfigLoaderOptions>,\n\t);\n\n\tpublic constructor(...args: ConstructorParameters) {\n\t\tif (hasResolver(args)) {\n\t\t\t/* istanbul ignore next */\n\t\t\tconst [resolvers, config, options = {}] = args;\n\t\t\tsuper(resolvers, config);\n\t\t\tthis.fs = /* istanbul ignore next */ options.fs ?? fs;\n\t\t} else {\n\t\t\t/* istanbul ignore next */\n\t\t\tconst [config, options = {}] = args;\n\t\t\tsuper(defaultResolvers, config);\n\t\t\tthis.fs = /* istanbul ignore next */ options.fs ?? fs;\n\t\t}\n\t\tthis.cache = new Map();\n\t}\n\n\t/**\n\t * Get configuration for given filename.\n\t *\n\t * When reading from stdin (`/dev/stdin`), the configuration is searched\n\t * from the current working directory.\n\t *\n\t * @param filename - Filename to get configuration for.\n\t * @param configOverride - Configuration to merge final result with.\n\t */\n\tpublic override getConfigFor(\n\t\tfilename: string,\n\t\tconfigOverride?: ConfigData,\n\t): ResolvedConfig | Promise<ResolvedConfig> {\n\t\tconst normalizedFilename = normalizeFilename(filename);\n\t\tconst override = this.loadFromObject(configOverride ?? {});\n\t\tif (isThenable(override)) {\n\t\t\treturn override.then((override) => {\n\t\t\t\treturn this._resolveAsync(normalizedFilename, override);\n\t\t\t});\n\t\t} else {\n\t\t\treturn this._resolveSync1(normalizedFilename, override);\n\t\t}\n\t}\n\n\t/**\n\t * Flush configuration cache.\n\t *\n\t * @param filename - If given only the cache for that file is flushed.\n\t */\n\tpublic override flushCache(filename?: string): void {\n\t\tif (filename) {\n\t\t\tthis.cache.delete(filename);\n\t\t\tconst normalized = normalizeFilename(filename);\n\t\t\tif (normalized !== filename) {\n\t\t\t\tthis.cache.delete(normalized);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.cache.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Load raw configuration from directory traversal.\n\t *\n\t * This configuration is not merged with global configuration and may return\n\t * `null` if no configuration files are found.\n\t */\n\n\tpublic fromFilename(filename: string): Config | Promise<Config | null> | null {\n\t\tif (filename === \"inline\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst cache = this.cache.get(filename);\n\t\tif (cache) {\n\t\t\treturn cache;\n\t\t}\n\n\t\tlet found = false;\n\t\tlet current = path.resolve(path.dirname(filename));\n\t\tlet config = this.empty();\n\n\t\tfor (;;) {\n\t\t\t/* search configuration files in current directory */\n\t\t\tfor (const configFile of findConfigurationFiles(this.fs, current)) {\n\t\t\t\tconst local = this.loadFromFile(configFile);\n\n\t\t\t\t/* if the loader returns an async config we exit out of the synchronous\n\t\t\t\t * processing and enter the async method so we can resolve any promises\n\t\t\t\t * as we go */\n\t\t\t\tif (isThenable(local)) {\n\t\t\t\t\treturn this.fromFilenameAsync(filename);\n\t\t\t\t}\n\n\t\t\t\tfound = true;\n\n\t\t\t\tconst merged = local.merge(this.resolvers, config);\n\n\t\t\t\t/* istanbul ignore if -- should never happen */\n\t\t\t\tif (isThenable(merged)) {\n\t\t\t\t\tthrow new Error(\"internal error: async result ended up in sync path\");\n\t\t\t\t}\n\t\t\t\tconfig = merged;\n\t\t\t}\n\n\t\t\t/* stop if a configuration with \"root\" is set to true */\n\t\t\tif (config.isRootFound()) {\n\t\t\t\tbreak;\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\t/* no config was found by loader, return null and let caller decide what to do */\n\t\tif (!found) {\n\t\t\tthis.cache.set(filename, null);\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.cache.set(filename, config);\n\t\treturn config;\n\t}\n\n\t/**\n\t * Async version of [[fromFilename]].\n\t *\n\t * @internal\n\t */\n\tpublic async fromFilenameAsync(filename: string): Promise<Config | null> {\n\t\tif (filename === \"inline\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst cache = this.cache.get(filename);\n\t\tif (cache) {\n\t\t\treturn cache;\n\t\t}\n\n\t\tlet found = false;\n\t\tlet current = path.resolve(path.dirname(filename));\n\t\tlet config = this.empty();\n\n\t\tfor (;;) {\n\t\t\t/* search configuration files in current directory */\n\t\t\tfor (const configFile of findConfigurationFiles(this.fs, current)) {\n\t\t\t\tconst local = await this.loadFromFile(configFile);\n\t\t\t\tfound = true;\n\t\t\t\tconfig = await local.merge(this.resolvers, config);\n\t\t\t}\n\n\t\t\t/* stop if a configuration with \"root\" is set to true */\n\t\t\tif (config.isRootFound()) {\n\t\t\t\tbreak;\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\t/* no config was found by loader, return null and let caller decide what to do */\n\t\tif (!found) {\n\t\t\tthis.cache.set(filename, null);\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.cache.set(filename, config);\n\t\treturn config;\n\t}\n\n\tprivate _merge(\n\t\tglobalConfig: Config,\n\t\toverride: Config,\n\t\tconfig: Config | null,\n\t): ResolvedConfig | Promise<ResolvedConfig> {\n\t\tconst merged = config\n\t\t\t? config.merge(this.resolvers, override)\n\t\t\t: globalConfig.merge(this.resolvers, override);\n\t\t/* istanbul ignore if -- covered by tsc, hard to recreate even with very specific testcases */\n\t\tif (isThenable(merged)) {\n\t\t\treturn merged.then((merged) => {\n\t\t\t\treturn merged.resolve();\n\t\t\t});\n\t\t} else {\n\t\t\treturn merged.resolve();\n\t\t}\n\t}\n\n\tprivate _resolveSync1(\n\t\tfilename: string,\n\t\toverride: Config,\n\t): ResolvedConfig | Promise<ResolvedConfig> {\n\t\tif (override.isRootFound()) {\n\t\t\treturn override.resolve();\n\t\t}\n\n\t\tconst globalConfig = this.getGlobalConfig();\n\t\t/* istanbul ignore if -- covered by tsc, hard to recreate even with very specific testcases */\n\t\tif (isThenable(globalConfig)) {\n\t\t\treturn globalConfig.then((globalConfig) => {\n\t\t\t\treturn this._resolveSync2(filename, override, globalConfig);\n\t\t\t});\n\t\t} else {\n\t\t\treturn this._resolveSync2(filename, override, globalConfig);\n\t\t}\n\t}\n\n\tprivate _resolveSync2(\n\t\tfilename: string,\n\t\toverride: Config,\n\t\tglobalConfig: Config,\n\t): ResolvedConfig | Promise<ResolvedConfig> {\n\t\t/* special case when the global configuration is marked as root, should not\n\t\t * try to load and more configuration files */\n\t\tif (globalConfig.isRootFound()) {\n\t\t\tconst merged = globalConfig.merge(this.resolvers, override);\n\t\t\t/* istanbul ignore if -- covered by tsc, hard to recreate even with very specific testcases */\n\t\t\tif (isThenable(merged)) {\n\t\t\t\treturn merged.then((merged) => {\n\t\t\t\t\treturn merged.resolve();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn merged.resolve();\n\t\t\t}\n\t\t}\n\n\t\tconst config = this.fromFilename(filename);\n\t\tif (isThenable(config)) {\n\t\t\treturn config.then((config) => {\n\t\t\t\treturn this._merge(globalConfig, override, config);\n\t\t\t});\n\t\t} else {\n\t\t\treturn this._merge(globalConfig, override, config);\n\t\t}\n\t}\n\n\tprivate async _resolveAsync(filename: string, override: Config): Promise<ResolvedConfig> {\n\t\tif (override.isRootFound()) {\n\t\t\treturn override.resolve();\n\t\t}\n\n\t\tconst globalConfig = await this.getGlobalConfig();\n\n\t\t/* special case when the global configuration is marked as root, should not\n\t\t * try to load and more configuration files */\n\t\tif (globalConfig.isRootFound()) {\n\t\t\tconst merged = await globalConfig.merge(this.resolvers, override);\n\t\t\treturn merged.resolve();\n\t\t}\n\n\t\tconst config = await this.fromFilenameAsync(filename);\n\t\treturn this._merge(globalConfig, override, config);\n\t}\n\n\t/**\n\t * @internal For testing only\n\t */\n\tpublic _getInternalCache(): Map<string, Config | null> {\n\t\treturn this.cache;\n\t}\n\n\tprotected defaultConfig(): Config | Promise<Config> {\n\t\treturn Config.defaultConfig();\n\t}\n}\n","import kleur from \"kleur\";\nimport { version } from \"../generated/package-json\";\nimport { type CompatibilityOptions, compatibilityCheckImpl } from \"./compatibility-check\";\n\nconst defaults: CompatibilityOptions = {\n\tsilent: false,\n\tversion,\n\tlogger(text: string): void {\n\t\t/* eslint-disable-next-line no-console -- expected to log */\n\t\tconsole.error(kleur.red(text));\n\t},\n};\n\n/**\n * Tests if plugin is compatible with html-validate library. Unless the `silent`\n * option is used a warning is displayed on the console.\n *\n * @public\n * @since v5.0.0\n * @param name - Name of plugin\n * @param declared - What library versions the plugin support (e.g. declared peerDependencies)\n * @returns - `true` if version is compatible\n */\nexport function compatibilityCheck(\n\tname: string,\n\tdeclared: string,\n\toptions?: Partial<CompatibilityOptions>,\n): boolean {\n\treturn compatibilityCheckImpl(name, declared, {\n\t\t...defaults,\n\t\t...options,\n\t});\n}\n"],"names":["fs","ConfigLoader","StaticConfigLoader","PerformanceTracker","normalizeSource","transformSource","Engine","Parser","transformSourceSync","transformFilename","transformFilenameSync","Reporter","configurationSchema","isThenable","UserError","path","isTransformer","options","ConfigError","existsSync","pathToFileURL","override","merged","globalConfig","config","Config","version","kleur","compatibilityCheckImpl"],"mappings":"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"}
1
+ {"version":3,"file":"core-nodejs.js","sources":["../../src/htmlvalidate.nodejs.ts","../../src/utils/require-uncached.ts","../../src/config/resolver/nodejs/determine-root-dir.ts","../../src/config/resolver/nodejs/expand-relative-path.ts","../../src/config/resolver/nodejs/cjs-resolver.ts","../../src/config/resolver/nodejs/import-function.ts","../../src/config/resolver/nodejs/internal-import.ts","../../src/config/resolver/nodejs/esm-resolver.ts","../../src/config/loaders/file-system.ts","../../src/flat-config/define-flat-config.ts","../../src/flat-config/find-flat-config-file.ts","../../src/flat-config/load-flat-config-file.ts","../../src/flat-config/merge-flat-config.ts","../../src/flat-config/flat-config-loader.ts","../../src/utils/compatibility-check.nodejs.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport { type SchemaObject } from \"ajv\";\nimport { type ConfigData, type ResolvedConfig, ConfigLoader } from \"./config\";\nimport { StaticConfigLoader } from \"./config/loaders/static\";\nimport { type Source, normalizeSource } from \"./context\";\nimport { type SourceHooks } from \"./context/source\";\nimport { type EventDump, type TokenDump, Engine } from \"./engine\";\nimport { UserError } from \"./error\";\nimport { type Message } from \"./message\";\nimport { Parser } from \"./parser\";\nimport { type PerformanceResult, PerformanceTracker } from \"./performance\";\nimport { type Report, Reporter } from \"./reporter\";\nimport { type RuleDocumentation } from \"./rule\";\nimport configurationSchema from \"./schema/config.json\";\nimport {\n\ttype TransformFS,\n\ttransformFilename,\n\ttransformFilenameSync,\n\ttransformSource,\n\ttransformSourceSync,\n} from \"./transform\";\nimport { isThenable } from \"./utils/is-thenable\";\n\nconst defaultFS: TransformFS = {\n\treadFileSync: fs.readFileSync,\n};\n\nfunction isSourceHooks(value: string | SourceHooks | ConfigData | undefined): value is SourceHooks {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\treturn [\"processAttribute\", \"processElement\"].some((key) => key in value);\n}\n\nfunction isConfigData(value: string | SourceHooks | ConfigData | undefined): value is ConfigData {\n\tif (!value || typeof value !== \"object\") {\n\t\treturn false;\n\t}\n\treturn ![\"processAttribute\", \"processElement\"].some((key) => key in value);\n}\n\n/**\n * Primary API for using HTML-validate.\n *\n * Provides high-level abstractions for common operations.\n *\n * @public\n */\nexport class HtmlValidate {\n\tprotected configLoader: ConfigLoader;\n\tprivate _performanceTracker: PerformanceTracker | null;\n\n\t/**\n\t * Create a new validator.\n\t *\n\t * @public\n\t * @param configLoader - Use a custom configuration loader.\n\t * @param config - If set it provides the global default configuration. By\n\t * default `Config.defaultConfig()` is used.\n\t */\n\tpublic constructor(config?: ConfigData);\n\tpublic constructor(configLoader: ConfigLoader);\n\tpublic constructor(arg?: ConfigLoader | ConfigData) {\n\t\tconst [loader, config] = arg instanceof ConfigLoader ? [arg, undefined] : [undefined, arg];\n\t\tthis.configLoader = loader ?? new StaticConfigLoader(config);\n\t\tthis._performanceTracker = null;\n\t}\n\n\t/**\n\t * Start recording performance data.\n\t *\n\t * When active, performance data is accumulated across all subsequent calls to\n\t * `validateString()`, `validateFile()` and similar methods until\n\t * {@link HtmlValidate.stopPerformance} is called.\n\t *\n\t * @internal\n\t */\n\tpublic startPerformance(): void {\n\t\tthis._performanceTracker = new PerformanceTracker();\n\t}\n\n\t/**\n\t * Stop recording performance data and return the result.\n\t *\n\t * @internal\n\t */\n\tpublic stopPerformance(): PerformanceResult {\n\t\tif (!this._performanceTracker) {\n\t\t\treturn { events: [], rules: [], configTime: 0, transformTime: 0, totalTime: 0 };\n\t\t}\n\t\tconst result = this._performanceTracker.getResult();\n\t\tthis._performanceTracker = null;\n\t\treturn result;\n\t}\n\n\t/**\n\t * Parse and validate HTML from string.\n\t *\n\t * @public\n\t * @param str - Text to parse.\n\t * @param filename - If set configuration is loaded for given filename.\n\t * @param hooks - Optional hooks (see [[Source]]) for definition.\n\t * @returns Report output.\n\t */\n\t/* eslint-disable @typescript-eslint/unified-signatures -- for easier readability */\n\tpublic validateString(str: string): Promise<Report>;\n\tpublic validateString(str: string, filename: string): Promise<Report>;\n\tpublic validateString(str: string, hooks: SourceHooks): Promise<Report>;\n\tpublic validateString(str: string, options: ConfigData): Promise<Report>;\n\tpublic validateString(str: string, filename: string, hooks: SourceHooks): Promise<Report>;\n\tpublic validateString(str: string, filename: string, options: ConfigData): Promise<Report>;\n\tpublic validateString(\n\t\tstr: string,\n\t\tfilename: string,\n\t\toptions: ConfigData,\n\t\thooks: SourceHooks,\n\t): Promise<Report>;\n\t/* eslint-enable @typescript-eslint/unified-signatures */\n\tpublic validateString(\n\t\tstr: string,\n\t\targ1?: string | SourceHooks | ConfigData,\n\t\targ2?: SourceHooks | ConfigData,\n\t\targ3?: SourceHooks,\n\t): Promise<Report> {\n\t\tconst filename = typeof arg1 === \"string\" ? arg1 : \"inline\";\n\t\tconst options = isConfigData(arg1) ? arg1 : isConfigData(arg2) ? arg2 : undefined; // eslint-disable-line sonarjs/no-nested-conditional -- easier to read than the alternative */\n\t\tconst hooks = isSourceHooks(arg1) ? arg1 : isSourceHooks(arg2) ? arg2 : arg3; // eslint-disable-line sonarjs/no-nested-conditional -- easier to read than the alternative */\n\t\tconst source = {\n\t\t\tdata: str,\n\t\t\tfilename,\n\t\t\tline: 1,\n\t\t\tcolumn: 1,\n\t\t\toffset: 0,\n\t\t\thooks,\n\t\t};\n\t\treturn this.validateSource(source, options);\n\t}\n\n\t/**\n\t * Parse and validate HTML from string.\n\t *\n\t * @public\n\t * @param str - Text to parse.\n\t * @param filename - If set configuration is loaded for given filename.\n\t * @param hooks - Optional hooks (see [[Source]]) for definition.\n\t * @returns Report output.\n\t */\n\t/* eslint-disable @typescript-eslint/unified-signatures -- for easier readability */\n\tpublic validateStringSync(str: string): Report;\n\tpublic validateStringSync(str: string, filename: string): Report;\n\tpublic validateStringSync(str: string, hooks: SourceHooks): Report;\n\tpublic validateStringSync(str: string, options: ConfigData): Report;\n\tpublic validateStringSync(str: string, filename: string, hooks: SourceHooks): Report;\n\tpublic validateStringSync(str: string, filename: string, options: ConfigData): Report;\n\tpublic validateStringSync(\n\t\tstr: string,\n\t\tfilename: string,\n\t\toptions: ConfigData,\n\t\thooks: SourceHooks,\n\t): Report;\n\t/* eslint-enable @typescript-eslint/unified-signatures */\n\tpublic validateStringSync(\n\t\tstr: string,\n\t\targ1?: string | SourceHooks | ConfigData,\n\t\targ2?: SourceHooks | ConfigData,\n\t\targ3?: SourceHooks,\n\t): Report {\n\t\tconst filename = typeof arg1 === \"string\" ? arg1 : \"inline\";\n\t\tconst options = isConfigData(arg1) ? arg1 : isConfigData(arg2) ? arg2 : undefined; // eslint-disable-line sonarjs/no-nested-conditional -- easier to read than the alternative */\n\t\tconst hooks = isSourceHooks(arg1) ? arg1 : isSourceHooks(arg2) ? arg2 : arg3; // eslint-disable-line sonarjs/no-nested-conditional -- easier to read than the alternative */\n\t\tconst source = {\n\t\t\tdata: str,\n\t\t\tfilename,\n\t\t\tline: 1,\n\t\t\tcolumn: 1,\n\t\t\toffset: 0,\n\t\t\thooks,\n\t\t};\n\t\treturn this.validateSourceSync(source, options);\n\t}\n\n\t/**\n\t * Parse and validate HTML from [[Source]].\n\t *\n\t * @public\n\t * @param input - Source to parse.\n\t * @returns Report output.\n\t */\n\tpublic async validateSource(input: Source, configOverride?: ConfigData): Promise<Report> {\n\t\tconst tracker = this._performanceTracker;\n\t\tconst source = normalizeSource(input);\n\t\tconst t0 = performance.now();\n\t\tconst config = await this.getConfigFor(source.filename, configOverride);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst t1 = performance.now();\n\t\ttracker?.trackConfig(t1 - t0);\n\t\tconst transformedSource = await transformSource(resolvers, config, source);\n\t\tconst t2 = performance.now();\n\t\ttracker?.trackTransform(t2 - t1);\n\t\tconst engine = new Engine(config, Parser, { tracker });\n\t\treturn engine.lint(transformedSource);\n\t}\n\n\t/**\n\t * Parse and validate HTML from [[Source]].\n\t *\n\t * @public\n\t * @param input - Source to parse.\n\t * @returns Report output.\n\t */\n\tpublic validateSourceSync(input: Source, configOverride?: ConfigData): Report {\n\t\tconst source = normalizeSource(input);\n\t\tconst t0 = performance.now();\n\t\tconst config = this.getConfigForSync(source.filename, configOverride);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst t1 = performance.now();\n\t\tthis._performanceTracker?.trackConfig(t1 - t0);\n\t\tconst transformedSource = transformSourceSync(resolvers, config, source);\n\t\tconst t2 = performance.now();\n\t\tthis._performanceTracker?.trackTransform(t2 - t1);\n\t\tconst engine = new Engine(config, Parser, { tracker: this._performanceTracker });\n\t\treturn engine.lint(transformedSource);\n\t}\n\n\t/**\n\t * Parse and validate HTML from file.\n\t *\n\t * @public\n\t * @param filename - Filename to read and parse.\n\t * @returns Report output.\n\t */\n\tpublic async validateFile(filename: string, fs: TransformFS = defaultFS): Promise<Report> {\n\t\tconst tracker = this._performanceTracker;\n\t\tconst t0 = performance.now();\n\t\tconst config = await this.getConfigFor(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst t1 = performance.now();\n\t\ttracker?.trackConfig(t1 - t0);\n\t\tconst source = await transformFilename(resolvers, config, filename, fs);\n\t\tconst t2 = performance.now();\n\t\ttracker?.trackTransform(t2 - t1);\n\t\tconst engine = new Engine(config, Parser, { tracker });\n\t\treturn engine.lint(source);\n\t}\n\n\t/**\n\t * Parse and validate HTML from file.\n\t *\n\t * @public\n\t * @param filename - Filename to read and parse.\n\t * @returns Report output.\n\t */\n\tpublic validateFileSync(filename: string, fs: TransformFS = defaultFS): Report {\n\t\tconst t0 = performance.now();\n\t\tconst config = this.getConfigForSync(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst t1 = performance.now();\n\t\tthis._performanceTracker?.trackConfig(t1 - t0);\n\t\tconst source = transformFilenameSync(resolvers, config, filename, fs);\n\t\tconst t2 = performance.now();\n\t\tthis._performanceTracker?.trackTransform(t2 - t1);\n\t\tconst engine = new Engine(config, Parser, { tracker: this._performanceTracker });\n\t\treturn engine.lint(source);\n\t}\n\n\t/**\n\t * Parse and validate HTML from multiple files. Result is merged together to a\n\t * single report.\n\t *\n\t * @param filenames - Filenames to read and parse.\n\t * @returns Report output.\n\t */\n\tpublic async validateMultipleFiles(\n\t\tfilenames: string[],\n\t\tfs: TransformFS = defaultFS,\n\t): Promise<Report> {\n\t\treturn Reporter.merge(filenames.map((filename) => this.validateFile(filename, fs)));\n\t}\n\n\t/**\n\t * Parse and validate HTML from multiple files. Result is merged together to a\n\t * single report.\n\t *\n\t * @param filenames - Filenames to read and parse.\n\t * @returns Report output.\n\t */\n\tpublic validateMultipleFilesSync(filenames: string[], fs: TransformFS = defaultFS): Report {\n\t\treturn Reporter.merge(filenames.map((filename) => this.validateFileSync(filename, fs)));\n\t}\n\n\t/**\n\t * Returns true if the given filename can be validated.\n\t *\n\t * A file is considered to be validatable if the extension is `.html` or if a\n\t * transformer matches the filename.\n\t *\n\t * This is mostly useful for tooling to determine whenever to validate the\n\t * file or not. CLI tools will run on all the given files anyway.\n\t */\n\tpublic async canValidate(filename: string): Promise<boolean> {\n\t\t/* .html is always supported */\n\t\tif (filename.toLowerCase().endsWith(\".html\")) {\n\t\t\treturn true;\n\t\t}\n\n\t\t/* test if there is a matching transformer */\n\t\tconst config = await this.getConfigFor(filename);\n\t\treturn config.canTransform(filename);\n\t}\n\n\t/**\n\t * Returns true if the given filename can be validated.\n\t *\n\t * A file is considered to be validatable if the extension is `.html` or if a\n\t * transformer matches the filename.\n\t *\n\t * This is mostly useful for tooling to determine whenever to validate the\n\t * file or not. CLI tools will run on all the given files anyway.\n\t */\n\tpublic canValidateSync(filename: string): boolean {\n\t\t/* .html is always supported */\n\t\tif (filename.toLowerCase().endsWith(\".html\")) {\n\t\t\treturn true;\n\t\t}\n\n\t\t/* test if there is a matching transformer */\n\t\tconst config = this.getConfigForSync(filename);\n\t\treturn config.canTransform(filename);\n\t}\n\n\t/**\n\t * Tokenize filename and output all tokens.\n\t *\n\t * Using CLI this is enabled with `--dump-tokens`. Mostly useful for\n\t * debugging.\n\t *\n\t * @internal\n\t * @param filename - Filename to tokenize.\n\t */\n\tpublic async dumpTokens(filename: string, fs: TransformFS = defaultFS): Promise<TokenDump[]> {\n\t\tconst config = await this.getConfigFor(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst source = await transformFilename(resolvers, config, filename, fs);\n\t\tconst engine = new Engine(config, Parser, { tracker: null });\n\t\treturn engine.dumpTokens(source);\n\t}\n\n\t/**\n\t * Parse filename and output all events.\n\t *\n\t * Using CLI this is enabled with `--dump-events`. Mostly useful for\n\t * debugging.\n\t *\n\t * @internal\n\t * @param filename - Filename to dump events from.\n\t */\n\tpublic async dumpEvents(filename: string, fs: TransformFS = defaultFS): Promise<EventDump[]> {\n\t\tconst config = await this.getConfigFor(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst source = await transformFilename(resolvers, config, filename, fs);\n\t\tconst engine = new Engine(config, Parser, { tracker: null });\n\t\treturn engine.dumpEvents(source);\n\t}\n\n\t/**\n\t * Parse filename and output DOM tree.\n\t *\n\t * Using CLI this is enabled with `--dump-tree`. Mostly useful for\n\t * debugging.\n\t *\n\t * @internal\n\t * @param filename - Filename to dump DOM tree from.\n\t */\n\tpublic async dumpTree(filename: string, fs: TransformFS = defaultFS): Promise<string[]> {\n\t\tconst config = await this.getConfigFor(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst source = await transformFilename(resolvers, config, filename, fs);\n\t\tconst engine = new Engine(config, Parser, { tracker: null });\n\t\treturn engine.dumpTree(source);\n\t}\n\n\t/**\n\t * Transform filename and output source data.\n\t *\n\t * Using CLI this is enabled with `--dump-source`. Mostly useful for\n\t * debugging.\n\t *\n\t * @internal\n\t * @param filename - Filename to dump source from.\n\t */\n\tpublic async dumpSource(filename: string, fs: TransformFS = defaultFS): Promise<string[]> {\n\t\tconst config = await this.getConfigFor(filename);\n\t\tconst resolvers = this.configLoader.getResolvers();\n\t\tconst sources = await transformFilename(resolvers, config, filename, fs);\n\t\treturn sources.reduce<string[]>((result: string[], source: Source) => {\n\t\t\tconst line = String(source.line);\n\t\t\tconst column = String(source.column);\n\t\t\tconst offset = String(source.offset);\n\t\t\tresult.push(`Source ${source.filename}@${line}:${column} (offset: ${offset})`);\n\t\t\tif (source.transformedBy) {\n\t\t\t\tresult.push(\"Transformed by:\");\n\t\t\t\tresult = result.concat(source.transformedBy.toReversed().map((name) => ` - ${name}`));\n\t\t\t}\n\t\t\tif (source.hooks && Object.keys(source.hooks).length > 0) {\n\t\t\t\tresult.push(\"Hooks\");\n\t\t\t\tfor (const [key, present] of Object.entries(source.hooks)) {\n\t\t\t\t\tif (present) {\n\t\t\t\t\t\tresult.push(` - ${key}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tresult.push(\"---\");\n\t\t\tresult = result.concat(source.data.split(\"\\n\"));\n\t\t\tresult.push(\"---\");\n\t\t\treturn result;\n\t\t}, []);\n\t}\n\n\t/**\n\t * Get effective configuration schema.\n\t */\n\tpublic getConfigurationSchema(): Promise<SchemaObject> {\n\t\treturn Promise.resolve(configurationSchema);\n\t}\n\n\t/**\n\t * Get effective metadata element schema.\n\t *\n\t * If a filename is given the configured plugins can extend the\n\t * schema. Filename must not be an existing file or a filetype normally\n\t * handled by html-validate but the path will be used when resolving\n\t * configuration. As a rule-of-thumb, set it to the elements json file.\n\t */\n\tpublic async getElementsSchema(filename?: string): Promise<SchemaObject> {\n\t\tconst config = await this.getConfigFor(filename ?? \"inline\");\n\t\tconst metaTable = config.getMetaTable();\n\t\treturn metaTable.getJSONSchema();\n\t}\n\n\t/**\n\t * Get effective metadata element schema.\n\t *\n\t * If a filename is given the configured plugins can extend the\n\t * schema. Filename must not be an existing file or a filetype normally\n\t * handled by html-validate but the path will be used when resolving\n\t * configuration. As a rule-of-thumb, set it to the elements json file.\n\t */\n\tpublic getElementsSchemaSync(filename?: string): SchemaObject {\n\t\tconst config = this.getConfigForSync(filename ?? \"inline\");\n\t\tconst metaTable = config.getMetaTable();\n\t\treturn metaTable.getJSONSchema();\n\t}\n\n\t/**\n\t * Get contextual documentation for the given rule. Configuration will be\n\t * resolved for given filename.\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * const report = await htmlvalidate.validateFile(\"my-file.html\");\n\t * for (const result of report.results){\n\t * for (const message of result.messages){\n\t * const documentation = await htmlvalidate.getContextualDocumentation(message, result.filePath);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @public\n\t * @since 8.0.0\n\t * @param message - Message reported during validation\n\t * @param filename - Filename used to resolve configuration.\n\t * @returns Contextual documentation or `null` if the rule does not exist.\n\t */\n\tpublic getContextualDocumentation(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tfilename?: string,\n\t): Promise<RuleDocumentation | null>;\n\n\t/**\n\t * Get contextual documentation for the given rule using provided\n\t * configuration.\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * const report = await htmlvalidate.validateFile(\"my-file.html\");\n\t * for (const result of report.results){\n\t * for (const message of result.messages){\n\t * const documentation = await htmlvalidate.getRuleDocumentation(message, result.filePath);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @public\n\t * @since 8.0.0\n\t * @param message - Message reported during validation\n\t * @param config - Configuration to use.\n\t * @returns Contextual documentation or `null` if the rule does not exist.\n\t */\n\tpublic getContextualDocumentation(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tconfig: ResolvedConfig | Promise<ResolvedConfig>,\n\t): Promise<RuleDocumentation | null>;\n\n\tpublic async getContextualDocumentation(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tfilenameOrConfig: ResolvedConfig | Promise<ResolvedConfig> | string = \"inline\",\n\t): Promise<RuleDocumentation | null> {\n\t\tconst config =\n\t\t\ttypeof filenameOrConfig === \"string\"\n\t\t\t\t? await this.getConfigFor(filenameOrConfig)\n\t\t\t\t: await filenameOrConfig;\n\t\tconst engine = new Engine(config, Parser, { tracker: null });\n\t\treturn engine.getRuleDocumentation(message);\n\t}\n\n\t/**\n\t * Get contextual documentation for the given rule. Configuration will be\n\t * resolved for given filename.\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * const report = htmlvalidate.validateFileSync(\"my-file.html\");\n\t * for (const result of report.results){\n\t * for (const message of result.messages){\n\t * const documentation = htmlvalidate.getRuleDocumentationSync(message, result.filePath);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @public\n\t * @since 8.0.0\n\t * @param message - Message reported during validation\n\t * @param filename - Filename used to resolve configuration.\n\t * @returns Contextual documentation or `null` if the rule does not exist.\n\t */\n\tpublic getContextualDocumentationSync(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tfilename?: string,\n\t): RuleDocumentation | null;\n\n\t/**\n\t * Get contextual documentation for the given rule using provided\n\t * configuration.\n\t *\n\t * @example\n\t *\n\t * ```js\n\t * const report = htmlvalidate.validateFileSync(\"my-file.html\");\n\t * for (const result of report.results){\n\t * for (const message of result.messages){\n\t * const documentation = htmlvalidate.getRuleDocumentationSync(message, result.filePath);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @public\n\t * @since 8.0.0\n\t * @param message - Message reported during validation\n\t * @param config - Configuration to use.\n\t * @returns Contextual documentation or `null` if the rule does not exist.\n\t */\n\tpublic getContextualDocumentationSync(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tconfig: ResolvedConfig,\n\t): RuleDocumentation | null;\n\n\tpublic getContextualDocumentationSync(\n\t\tmessage: Pick<Message, \"ruleId\" | \"context\">,\n\t\tfilenameOrConfig: ResolvedConfig | string = \"inline\",\n\t): RuleDocumentation | null {\n\t\tconst config =\n\t\t\ttypeof filenameOrConfig === \"string\"\n\t\t\t\t? this.getConfigForSync(filenameOrConfig)\n\t\t\t\t: filenameOrConfig;\n\t\tconst engine = new Engine(config, Parser, { tracker: null });\n\t\treturn engine.getRuleDocumentation(message);\n\t}\n\n\t/**\n\t * Get contextual documentation for the given rule.\n\t *\n\t * Typical usage:\n\t *\n\t * ```js\n\t * const report = await htmlvalidate.validateFile(\"my-file.html\");\n\t * for (const result of report.results){\n\t * const config = await htmlvalidate.getConfigFor(result.filePath);\n\t * for (const message of result.messages){\n\t * const documentation = await htmlvalidate.getRuleDocumentation(message.ruleId, config, message.context);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @internal\n\t * @deprecated Deprecated since 8.0.0, use [[getContextualDocumentation]] instead.\n\t * @param ruleId - Rule to get documentation for.\n\t * @param config - If set it provides more accurate description by using the\n\t * correct configuration for the file.\n\t * @param context - If set to `Message.context` some rules can provide\n\t * contextual details and suggestions.\n\t */\n\tpublic async getRuleDocumentation(\n\t\truleId: string,\n\t\tconfig: ResolvedConfig | Promise<ResolvedConfig> | null = null,\n\t\tcontext: unknown | null = null,\n\t): Promise<RuleDocumentation | null> {\n\t\tconst c = config ?? this.getConfigFor(\"inline\");\n\t\tconst engine = new Engine(await c, Parser, { tracker: null });\n\t\treturn engine.getRuleDocumentation({ ruleId, context });\n\t}\n\n\t/**\n\t * Get contextual documentation for the given rule.\n\t *\n\t * Typical usage:\n\t *\n\t * ```js\n\t * const report = htmlvalidate.validateFileSync(\"my-file.html\");\n\t * for (const result of report.results){\n\t * const config = htmlvalidate.getConfigForSync(result.filePath);\n\t * for (const message of result.messages){\n\t * const documentation = htmlvalidate.getRuleDocumentationSync(message.ruleId, config, message.context);\n\t * // do something with documentation\n\t * }\n\t * }\n\t * ```\n\t *\n\t * @internal\n\t * @deprecated Deprecated since 8.0.0, use [[getContextualDocumentationSync]] instead.\n\t * @param ruleId - Rule to get documentation for.\n\t * @param config - If set it provides more accurate description by using the\n\t * correct configuration for the file.\n\t * @param context - If set to `Message.context` some rules can provide\n\t * contextual details and suggestions.\n\t */\n\tpublic getRuleDocumentationSync(\n\t\truleId: string,\n\t\tconfig: ResolvedConfig | null = null,\n\t\tcontext: unknown | null = null,\n\t): RuleDocumentation | null {\n\t\tconst c = config ?? this.getConfigForSync(\"inline\");\n\t\tconst engine = new Engine(c, Parser, { tracker: null });\n\t\treturn engine.getRuleDocumentation({ ruleId, context });\n\t}\n\n\t/**\n\t * Create a parser configured for given filename.\n\t *\n\t * @internal\n\t * @param source - Source to use.\n\t */\n\tpublic async getParserFor(source: Source): Promise<Parser> {\n\t\tconst config = await this.getConfigFor(source.filename);\n\t\treturn new Parser(config);\n\t}\n\n\t/**\n\t * Get configuration for given filename.\n\t *\n\t * See [[FileSystemConfigLoader]] for details.\n\t *\n\t * @public\n\t * @param filename - Filename to get configuration for.\n\t * @param configOverride - Configuration to apply last.\n\t */\n\tpublic getConfigFor(filename: string, configOverride?: ConfigData): Promise<ResolvedConfig> {\n\t\tconst config = this.configLoader.getConfigFor(filename, configOverride);\n\t\treturn Promise.resolve(config);\n\t}\n\n\t/**\n\t * Get configuration for given filename.\n\t *\n\t * See [[FileSystemConfigLoader]] for details.\n\t *\n\t * @public\n\t * @param filename - Filename to get configuration for.\n\t * @param configOverride - Configuration to apply last.\n\t */\n\tpublic getConfigForSync(filename: string, configOverride?: ConfigData): ResolvedConfig {\n\t\tconst config = this.configLoader.getConfigFor(filename, configOverride);\n\t\tif (isThenable(config)) {\n\t\t\tthrow new UserError(\"Cannot use asynchronous config loader with synchronous api\");\n\t\t}\n\t\treturn config;\n\t}\n\n\t/**\n\t * Get current configuration loader.\n\t *\n\t * @public\n\t * @since %version%\n\t * @returns Current configuration loader.\n\t */\n\t/* istanbul ignore next -- not testing setters/getters */\n\tpublic getConfigLoader(): ConfigLoader {\n\t\treturn this.configLoader;\n\t}\n\n\t/**\n\t * Set configuration loader.\n\t *\n\t * @public\n\t * @since %version%\n\t * @param loader - New configuration loader to use.\n\t */\n\t/* istanbul ignore next -- not testing setters/getters */\n\tpublic setConfigLoader(loader: ConfigLoader): void {\n\t\tthis.configLoader = loader;\n\t}\n\n\t/**\n\t * Flush configuration cache. Clears full cache unless a filename is given.\n\t *\n\t * See [[FileSystemConfigLoader]] for details.\n\t *\n\t * @public\n\t * @param filename - If set, only flush cache for given filename.\n\t */\n\tpublic flushConfigCache(filename?: string): void {\n\t\tthis.configLoader.flushCache(filename);\n\t}\n}\n","/* eslint-disable @typescript-eslint/no-deprecated -- works for now and this will be removed when commonjs support ends */\n\n/**\n * Similar to `require(..)` but removes the cached copy first.\n */\nexport function requireUncached(require: NodeJS.Require, moduleId: string): unknown {\n\tconst filename = require.resolve(moduleId);\n\n\t/* remove references from the parent module to prevent memory leak */\n\tconst m = require.cache[filename];\n\tif (m?.parent) {\n\t\tconst { parent } = m;\n\t\tfor (let i = parent.children.length - 1; i >= 0; i--) {\n\t\t\tif (parent.children[i].id === filename) {\n\t\t\t\tparent.children.splice(i, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t/* remove old module from cache */\n\t/* eslint-disable-next-line @typescript-eslint/no-dynamic-delete -- needed to perform its function */\n\tdelete require.cache[filename];\n\n\t/* eslint-disable-next-line import-x/no-dynamic-require, security/detect-non-literal-require -- as expected but should be moved to upcoming resolver class */\n\treturn require(filename);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nlet cachedRootDir: string | null = null;\n\ninterface FSLike {\n\texistsSync(path: string): boolean;\n}\n\n/**\n * @internal\n */\nexport function determineRootDirImpl(intial: string, fs: FSLike): string {\n\t/* try to locate package.json */\n\tlet current = intial;\n\n\tfor (;;) {\n\t\tconst search = path.join(current, \"package.json\");\n\t\tif (fs.existsSync(search)) {\n\t\t\treturn current;\n\t\t}\n\n\t\t/* get the parent directory */\n\t\tconst child = current;\n\t\tcurrent = path.dirname(current);\n\n\t\t/* stop if this is the root directory */\n\t\tif (current === child) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* default to working directory if no package.json is found */\n\treturn intial;\n}\n\n/**\n * Try to determine root directory based on the location of the closest\n * `package.json`. Fallbacks on `process.cwd()` if no package.json was found.\n *\n * @internal\n */\n/* istanbul ignore next: cached version of determineRootDirImpl, no need to test */\nexport function determineRootDir(): string {\n\tcachedRootDir ??= determineRootDirImpl(process.cwd(), fs);\n\treturn cachedRootDir;\n}\n","import path from \"node:path\";\n\n/**\n * @internal\n */\nexport function expandRelativePath<T>(value: string | T, { cwd }: { cwd: string }): string | T {\n\tif (typeof value === \"string\" && value.startsWith(\".\")) {\n\t\treturn path.normalize(path.join(cwd, value));\n\t} else {\n\t\treturn value;\n\t}\n}\n","import path from \"node:path\";\nimport { type MetaDataTable } from \"../../../meta\";\nimport { type Plugin } from \"../../../plugin\";\nimport { legacyRequire } from \"../../../resolve\";\nimport { type Transformer } from \"../../../transform\";\nimport { requireUncached } from \"../../../utils/require-uncached\";\nimport { type ConfigData } from \"../../config-data\";\nimport { ConfigError } from \"../../error\";\nimport { type Resolver, type ResolverOptions } from \"../resolver\";\nimport { determineRootDir } from \"./determine-root-dir\";\nimport { expandRelativePath } from \"./expand-relative-path\";\n\n/**\n * @internal\n */\nexport interface RequireError extends Error {\n\tcode: string;\n}\n\nfunction isRequireError(error: unknown): error is RequireError {\n\treturn Boolean(error && typeof error === \"object\" && \"code\" in error);\n}\n\nfunction isTransformer(value: Transformer | Plugin): value is Transformer {\n\treturn typeof value === \"function\";\n}\n\n/**\n * CommonJS resolver.\n *\n * @public\n * @since 8.8.0\n */\nexport type CommonJSResolver = Required<Resolver>;\n\n/**\n * Create a new resolver for NodeJS packages using `require(..)`.\n *\n * If the module name contains `<rootDir>` (e.g. `<rootDir/foo`) it will be\n * expanded relative to the root directory either explicitly set by the\n * `rootDir` parameter or determined automatically by the closest `package.json`\n * file (starting at the current working directory).\n *\n * @public\n * @since 8.8.0\n */\nexport function cjsResolver(options: { rootDir?: string } = {}): CommonJSResolver {\n\tconst rootDir = options.rootDir ?? determineRootDir();\n\n\t/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- technical debt, should return unknown as use explicit cast */\n\tfunction internalRequire<T = unknown>(id: string, { cache }: ResolverOptions): T | null {\n\t\tconst moduleName = id.replace(\"<rootDir>\", rootDir);\n\t\ttry {\n\t\t\t/* istanbul ignore else: the tests only runs the cached versions to get\n\t\t\t * unmodified access to `require`, the implementation of `requireUncached`\n\t\t\t * is assumed to be tested elsewhere */\n\t\t\tif (cache) {\n\t\t\t\treturn legacyRequire(moduleName) as T;\n\t\t\t} else {\n\t\t\t\treturn requireUncached(legacyRequire, moduleName) as T;\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\tif (isRequireError(err) && err.code === \"MODULE_NOT_FOUND\") {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\treturn {\n\t\tname: \"nodejs-resolver\",\n\n\t\tresolveElements(id: string, options: ResolverOptions): MetaDataTable | null {\n\t\t\treturn internalRequire(id, options);\n\t\t},\n\n\t\tresolveConfig(id: string, options: ResolverOptions): ConfigData | null {\n\t\t\tconst configData = internalRequire<ConfigData>(id, options);\n\t\t\tif (!configData) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t/* expand any relative paths */\n\t\t\tconst cwd = path.dirname(id);\n\t\t\tconst expand = <T>(value: string | T): string | T => expandRelativePath(value, { cwd });\n\n\t\t\tif (Array.isArray(configData.elements)) {\n\t\t\t\tconfigData.elements = configData.elements.map(expand);\n\t\t\t}\n\n\t\t\tif (Array.isArray(configData.extends)) {\n\t\t\t\tconfigData.extends = configData.extends.map(expand);\n\t\t\t}\n\n\t\t\tif (Array.isArray(configData.plugins)) {\n\t\t\t\tconfigData.plugins = configData.plugins.map(expand);\n\t\t\t}\n\n\t\t\treturn configData;\n\t\t},\n\n\t\tresolvePlugin(id: string, options: ResolverOptions): Plugin | null {\n\t\t\treturn internalRequire<Plugin>(id, options);\n\t\t},\n\n\t\tresolveTransformer(id: string, options: ResolverOptions): Transformer | null {\n\t\t\tconst mod = internalRequire<Transformer | Plugin>(id, options);\n\t\t\tif (!mod) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (isTransformer(mod)) {\n\t\t\t\treturn mod;\n\t\t\t}\n\n\t\t\t/* this is not a proper transformer, is it a plugin exposing a transformer? */\n\t\t\tif (mod.transformer) {\n\t\t\t\tthrow new ConfigError(\n\t\t\t\t\t`Module \"${id}\" is not a valid transformer. This looks like a plugin, did you forget to load the plugin first?`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow new ConfigError(`Module \"${id}\" is not a valid transformer.`);\n\t\t},\n\t};\n}\n","/* istanbul ignore file: this file is only for easier mocking */\n\n/**\n * Wrapper around import() so we can mock it in unittests.\n *\n * @internal\n */\nexport function importFunction(id: string): unknown {\n\treturn import(id);\n}\n","import { existsSync } from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport { UserError } from \"../../../error\";\nimport { importResolve } from \"../../../resolve\";\nimport { type ResolverOptions } from \"../resolver\";\nimport { importFunction } from \"./import-function\";\n\n/**\n * @internal\n */\nexport interface ImportError extends Error {\n\tcode: string;\n\trequireStack?: string[];\n}\n\nasync function getModuleName(\n\tid: string,\n\t{ cache, rootDir }: { cache: boolean; rootDir: string },\n): Promise<URL> {\n\tconst moduleName = id.replace(\"<rootDir>\", rootDir);\n\tconst url = existsSync(id) ? pathToFileURL(id) : importResolve(moduleName);\n\n\tif (url.protocol !== \"file:\") {\n\t\treturn url;\n\t}\n\n\t/* istanbul ignore else: the tests only runs the cached versions */\n\tif (cache) {\n\t\treturn url;\n\t} else {\n\t\t/* Cachebusting in ESM is tricky, we cannot flush the cache of the old import\n\t\t * but a common workaround is to append ?something to the path. It only works\n\t\t * with absolute paths though so we must first use `import.meta.resolve(..)`\n\t\t * which doesn't play nice with CJS. Then we will leak memory each time a\n\t\t * fresh copy is loaded and there doesn't seem to be a way to deal with this\n\t\t * yet. We use the file mtime to at least try to retain the copy as long as\n\t\t * possible but this will fail for transitive imports but at least with\n\t\t * directly loaded configurations it would reload property. */\n\t\tconst stat = await fs.stat(url);\n\t\turl.searchParams.append(\"mtime\", String(stat.mtime.getTime()));\n\t\treturn url;\n\t}\n}\n\nfunction isImportError(error: unknown): error is ImportError {\n\treturn Boolean(error && typeof error === \"object\" && \"code\" in error);\n}\n\n/**\n * @internal\n */\nexport async function internalImport<T = unknown>(\n\tid: string,\n\trootDir: string,\n\t{ cache }: ResolverOptions,\n): Promise<T | null> {\n\t/* this is a workaround for rollup which mangles import attributes so we\n\t * cannot use `import(.., { with: { type: \"json\" } })` to import a json\n\t * file. */\n\t/* istanbul ignore if: workaround, not tested, should be removed if the compiler bug is fixed */\n\tif (id.endsWith(\".json\")) {\n\t\tconst content = await fs.readFile(id, \"utf-8\");\n\t\treturn JSON.parse(content) as T;\n\t}\n\n\ttry {\n\t\tconst url = await getModuleName(id, { cache, rootDir });\n\t\tif (url.protocol !== \"file:\") {\n\t\t\treturn null;\n\t\t}\n\t\tconst moduleName = url.toString();\n\t\tconst { default: defaultImport } = (await importFunction(moduleName)) as { default: T };\n\t\tif (!defaultImport) {\n\t\t\tthrow new UserError(`\"${id}\" does not have a default export`);\n\t\t}\n\t\treturn defaultImport;\n\t} catch (err: unknown) {\n\t\tif (isImportError(err) && err.code === \"MODULE_NOT_FOUND\" && !err.requireStack) {\n\t\t\treturn null;\n\t\t}\n\t\tthrow err;\n\t}\n}\n","import path from \"node:path\";\nimport { type MetaDataTable } from \"../../../meta\";\nimport { type Plugin } from \"../../../plugin\";\nimport { type Transformer } from \"../../../transform\";\nimport { type ConfigData } from \"../../config-data\";\nimport { ConfigError } from \"../../error\";\nimport { type Resolver, type ResolverOptions } from \"../resolver\";\nimport { determineRootDir } from \"./determine-root-dir\";\nimport { expandRelativePath } from \"./expand-relative-path\";\nimport { internalImport } from \"./internal-import\";\n\nfunction isTransformer(value: Transformer | Plugin): value is Transformer {\n\treturn typeof value === \"function\";\n}\n\n/**\n * ESM resolver.\n *\n * @public\n * @since 9.0.0\n */\nexport type ESMResolver = Required<Resolver>;\n\n/**\n * Create a new resolver for NodeJS packages using `import(..)`.\n *\n * If the module name contains `<rootDir>` (e.g. `<rootDir/foo`) it will be\n * expanded relative to the root directory either explicitly set by the\n * `rootDir` parameter or determined automatically by the closest `package.json`\n * file (starting at the current working directory).\n *\n * @public\n * @since 9.0.0\n */\nexport function esmResolver(options: { rootDir?: string } = {}): ESMResolver {\n\tconst rootDir = options.rootDir ?? determineRootDir();\n\n\treturn {\n\t\tname: \"esm-resolver\",\n\n\t\tresolveElements(id: string, options: ResolverOptions): Promise<MetaDataTable | null> {\n\t\t\treturn internalImport(id, rootDir, options);\n\t\t},\n\n\t\tasync resolveConfig(id: string, options: ResolverOptions): Promise<ConfigData | null> {\n\t\t\tconst configData = await internalImport<ConfigData>(id, rootDir, options);\n\t\t\tif (!configData) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t/* expand any relative paths */\n\t\t\tconst cwd = path.dirname(id);\n\t\t\tconst expand = <T>(value: string | T): string | T => expandRelativePath(value, { cwd });\n\n\t\t\tif (Array.isArray(configData.elements)) {\n\t\t\t\tconfigData.elements = configData.elements.map(expand);\n\t\t\t}\n\n\t\t\tif (Array.isArray(configData.extends)) {\n\t\t\t\tconfigData.extends = configData.extends.map(expand);\n\t\t\t}\n\n\t\t\tif (Array.isArray(configData.plugins)) {\n\t\t\t\tconfigData.plugins = configData.plugins.map(expand);\n\t\t\t}\n\n\t\t\treturn configData;\n\t\t},\n\n\t\tresolvePlugin(id: string, options: ResolverOptions): Promise<Plugin | null> {\n\t\t\treturn internalImport<Plugin>(id, rootDir, options);\n\t\t},\n\n\t\tasync resolveTransformer(id: string, options: ResolverOptions): Promise<Transformer | null> {\n\t\t\tconst mod = await internalImport<Transformer | Plugin>(id, rootDir, options);\n\t\t\tif (!mod) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (isTransformer(mod)) {\n\t\t\t\treturn mod;\n\t\t\t}\n\n\t\t\t/* this is not a proper transformer, is it a plugin exposing a transformer? */\n\t\t\tif (mod.transformer) {\n\t\t\t\tthrow new ConfigError(\n\t\t\t\t\t`Module \"${id}\" is not a valid transformer. This looks like a plugin, did you forget to load the plugin first?`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthrow new ConfigError(`Module \"${id}\" is not a valid transformer.`);\n\t\t},\n\t};\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { isThenable } from \"../../utils/is-thenable\";\nimport { Config } from \"../config\";\nimport { type ConfigData } from \"../config-data\";\nimport { ConfigLoader } from \"../config-loader\";\nimport { type ResolvedConfig } from \"../resolved-config\";\nimport { type Resolver } from \"../resolver\";\nimport { type FSLike, esmResolver } from \"../resolver/nodejs\";\n\n/**\n * Options for [[FileSystemConfigLoader]].\n *\n * @public\n */\nexport interface FileSystemConfigLoaderOptions {\n\t/** An implementation of `fs` as needed by [[FileSystemConfigLoader]] */\n\tfs: FSLike;\n}\n\n/**\n * @internal\n */\nfunction findConfigurationFiles(fs: FSLike, directory: string): string[] {\n\treturn [\"json\", \"mjs\", \"cjs\", \"js\"]\n\t\t.map((extension) => path.join(directory, `.htmlvalidate.${extension}`))\n\t\t.filter((filePath) => fs.existsSync(filePath));\n}\n\n/**\n * Normalize filename for configuration resolution.\n *\n * When reading from stdin (`/dev/stdin`), returns a path based on the current\n * working directory to enable proper configuration file discovery.\n *\n * @internal\n */\nfunction normalizeFilename(filename: string): string {\n\treturn filename === \"/dev/stdin\" ? path.join(process.cwd(), \"noop.html\") : filename;\n}\n\nconst defaultResolvers: Resolver[] = [esmResolver()];\n\ntype ConstructorParametersDefault = [ConfigData?, Partial<FileSystemConfigLoaderOptions>?];\ntype ConstructorParametersResolver = [\n\tResolver[],\n\tConfigData?,\n\tPartial<FileSystemConfigLoaderOptions>?,\n];\ntype ConstructorParameters = ConstructorParametersDefault | ConstructorParametersResolver;\n\nfunction hasResolver(value: ConstructorParameters): value is ConstructorParametersResolver {\n\treturn Array.isArray(value[0]);\n}\n\n/**\n * Loads configuration by traversing filesystem.\n *\n * Configuration is read from three sources and in the following order:\n *\n * 1. Global configuration passed to constructor.\n * 2. Configuration files found when traversing the directory structure.\n * 3. Override passed to this function.\n *\n * The following configuration filenames are searched:\n *\n * - `.htmlvalidate.json`\n * - `.htmlvalidate.js`\n * - `.htmlvalidate.cjs`\n * - `.htmlvalidate.mjs`\n *\n * Global configuration is used when no configuration file is found. The\n * result is always merged with override if present.\n *\n * The `root` property set to `true` affects the configuration as following:\n *\n * 1. If set in override the override is returned as-is.\n * 2. If set in the global config the override is merged into global and\n * returned. No configuration files are searched.\n * 3. Setting `root` in configuration file only stops directory traversal.\n *\n * @public\n */\nexport class FileSystemConfigLoader extends ConfigLoader {\n\tprotected cache: Map<string, Config | null>;\n\tprivate fs: FSLike;\n\n\t/**\n\t * Create a filesystem configuration loader with default resolvers.\n\t *\n\t * @param fs - `fs` implementation,\n\t * @param config - Global configuration.\n\t * @param configFactory - Optional configuration factory.\n\t */\n\tpublic constructor(config?: ConfigData, options?: Partial<FileSystemConfigLoaderOptions>);\n\n\t/**\n\t * Create a filesystem configuration loader with custom resolvers.\n\t *\n\t * @param fs - `fs` implementation,\n\t * @param resolvers - Resolvers to use.\n\t * @param config - Global configuration.\n\t * @param configFactory - Optional configuration factory.\n\t */\n\tpublic constructor(\n\t\tresolvers: Resolver[],\n\t\tconfig?: ConfigData,\n\t\toptions?: Partial<FileSystemConfigLoaderOptions>,\n\t);\n\n\tpublic constructor(...args: ConstructorParameters) {\n\t\tif (hasResolver(args)) {\n\t\t\t/* istanbul ignore next */\n\t\t\tconst [resolvers, config, options = {}] = args;\n\t\t\tsuper(resolvers, config);\n\t\t\tthis.fs = /* istanbul ignore next */ options.fs ?? fs;\n\t\t} else {\n\t\t\t/* istanbul ignore next */\n\t\t\tconst [config, options = {}] = args;\n\t\t\tsuper(defaultResolvers, config);\n\t\t\tthis.fs = /* istanbul ignore next */ options.fs ?? fs;\n\t\t}\n\t\tthis.cache = new Map();\n\t}\n\n\t/**\n\t * Get configuration for given filename.\n\t *\n\t * When reading from stdin (`/dev/stdin`), the configuration is searched\n\t * from the current working directory.\n\t *\n\t * @param filename - Filename to get configuration for.\n\t * @param configOverride - Configuration to merge final result with.\n\t */\n\tpublic override getConfigFor(\n\t\tfilename: string,\n\t\tconfigOverride?: ConfigData,\n\t): ResolvedConfig | Promise<ResolvedConfig> {\n\t\tconst normalizedFilename = normalizeFilename(filename);\n\t\tconst override = this.loadFromObject(configOverride ?? {});\n\t\tif (isThenable(override)) {\n\t\t\treturn override.then((override) => {\n\t\t\t\treturn this._resolveAsync(normalizedFilename, override);\n\t\t\t});\n\t\t} else {\n\t\t\treturn this._resolveSync1(normalizedFilename, override);\n\t\t}\n\t}\n\n\t/**\n\t * Flush configuration cache.\n\t *\n\t * @param filename - If given only the cache for that file is flushed.\n\t */\n\tpublic override flushCache(filename?: string): void {\n\t\tif (filename) {\n\t\t\tthis.cache.delete(filename);\n\t\t\tconst normalized = normalizeFilename(filename);\n\t\t\tif (normalized !== filename) {\n\t\t\t\tthis.cache.delete(normalized);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.cache.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Load raw configuration from directory traversal.\n\t *\n\t * This configuration is not merged with global configuration and may return\n\t * `null` if no configuration files are found.\n\t */\n\n\tpublic fromFilename(filename: string): Config | Promise<Config | null> | null {\n\t\tif (filename === \"inline\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst cache = this.cache.get(filename);\n\t\tif (cache) {\n\t\t\treturn cache;\n\t\t}\n\n\t\tlet found = false;\n\t\tlet current = path.resolve(path.dirname(filename));\n\t\tlet config = this.empty();\n\n\t\tfor (;;) {\n\t\t\t/* search configuration files in current directory */\n\t\t\tfor (const configFile of findConfigurationFiles(this.fs, current)) {\n\t\t\t\tconst local = this.loadFromFile(configFile);\n\n\t\t\t\t/* if the loader returns an async config we exit out of the synchronous\n\t\t\t\t * processing and enter the async method so we can resolve any promises\n\t\t\t\t * as we go */\n\t\t\t\tif (isThenable(local)) {\n\t\t\t\t\treturn this.fromFilenameAsync(filename);\n\t\t\t\t}\n\n\t\t\t\tfound = true;\n\n\t\t\t\tconst merged = local.merge(this.resolvers, config);\n\n\t\t\t\t/* istanbul ignore if -- should never happen */\n\t\t\t\tif (isThenable(merged)) {\n\t\t\t\t\tthrow new Error(\"internal error: async result ended up in sync path\");\n\t\t\t\t}\n\t\t\t\tconfig = merged;\n\t\t\t}\n\n\t\t\t/* stop if a configuration with \"root\" is set to true */\n\t\t\tif (config.isRootFound()) {\n\t\t\t\tbreak;\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\t/* no config was found by loader, return null and let caller decide what to do */\n\t\tif (!found) {\n\t\t\tthis.cache.set(filename, null);\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.cache.set(filename, config);\n\t\treturn config;\n\t}\n\n\t/**\n\t * Async version of [[fromFilename]].\n\t *\n\t * @internal\n\t */\n\tpublic async fromFilenameAsync(filename: string): Promise<Config | null> {\n\t\tif (filename === \"inline\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst cache = this.cache.get(filename);\n\t\tif (cache) {\n\t\t\treturn cache;\n\t\t}\n\n\t\tlet found = false;\n\t\tlet current = path.resolve(path.dirname(filename));\n\t\tlet config = this.empty();\n\n\t\tfor (;;) {\n\t\t\t/* search configuration files in current directory */\n\t\t\tfor (const configFile of findConfigurationFiles(this.fs, current)) {\n\t\t\t\tconst local = await this.loadFromFile(configFile);\n\t\t\t\tfound = true;\n\t\t\t\tconfig = await local.merge(this.resolvers, config);\n\t\t\t}\n\n\t\t\t/* stop if a configuration with \"root\" is set to true */\n\t\t\tif (config.isRootFound()) {\n\t\t\t\tbreak;\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\t/* no config was found by loader, return null and let caller decide what to do */\n\t\tif (!found) {\n\t\t\tthis.cache.set(filename, null);\n\t\t\treturn null;\n\t\t}\n\n\t\tthis.cache.set(filename, config);\n\t\treturn config;\n\t}\n\n\tprivate _merge(\n\t\tglobalConfig: Config,\n\t\toverride: Config,\n\t\tconfig: Config | null,\n\t): ResolvedConfig | Promise<ResolvedConfig> {\n\t\tconst merged = config\n\t\t\t? config.merge(this.resolvers, override)\n\t\t\t: globalConfig.merge(this.resolvers, override);\n\t\t/* istanbul ignore if -- covered by tsc, hard to recreate even with very specific testcases */\n\t\tif (isThenable(merged)) {\n\t\t\treturn merged.then((merged) => {\n\t\t\t\treturn merged.resolve();\n\t\t\t});\n\t\t} else {\n\t\t\treturn merged.resolve();\n\t\t}\n\t}\n\n\tprivate _resolveSync1(\n\t\tfilename: string,\n\t\toverride: Config,\n\t): ResolvedConfig | Promise<ResolvedConfig> {\n\t\tif (override.isRootFound()) {\n\t\t\treturn override.resolve();\n\t\t}\n\n\t\tconst globalConfig = this.getGlobalConfig();\n\t\t/* istanbul ignore if -- covered by tsc, hard to recreate even with very specific testcases */\n\t\tif (isThenable(globalConfig)) {\n\t\t\treturn globalConfig.then((globalConfig) => {\n\t\t\t\treturn this._resolveSync2(filename, override, globalConfig);\n\t\t\t});\n\t\t} else {\n\t\t\treturn this._resolveSync2(filename, override, globalConfig);\n\t\t}\n\t}\n\n\tprivate _resolveSync2(\n\t\tfilename: string,\n\t\toverride: Config,\n\t\tglobalConfig: Config,\n\t): ResolvedConfig | Promise<ResolvedConfig> {\n\t\t/* special case when the global configuration is marked as root, should not\n\t\t * try to load and more configuration files */\n\t\tif (globalConfig.isRootFound()) {\n\t\t\tconst merged = globalConfig.merge(this.resolvers, override);\n\t\t\t/* istanbul ignore if -- covered by tsc, hard to recreate even with very specific testcases */\n\t\t\tif (isThenable(merged)) {\n\t\t\t\treturn merged.then((merged) => {\n\t\t\t\t\treturn merged.resolve();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\treturn merged.resolve();\n\t\t\t}\n\t\t}\n\n\t\tconst config = this.fromFilename(filename);\n\t\tif (isThenable(config)) {\n\t\t\treturn config.then((config) => {\n\t\t\t\treturn this._merge(globalConfig, override, config);\n\t\t\t});\n\t\t} else {\n\t\t\treturn this._merge(globalConfig, override, config);\n\t\t}\n\t}\n\n\tprivate async _resolveAsync(filename: string, override: Config): Promise<ResolvedConfig> {\n\t\tif (override.isRootFound()) {\n\t\t\treturn override.resolve();\n\t\t}\n\n\t\tconst globalConfig = await this.getGlobalConfig();\n\n\t\t/* special case when the global configuration is marked as root, should not\n\t\t * try to load and more configuration files */\n\t\tif (globalConfig.isRootFound()) {\n\t\t\tconst merged = await globalConfig.merge(this.resolvers, override);\n\t\t\treturn merged.resolve();\n\t\t}\n\n\t\tconst config = await this.fromFilenameAsync(filename);\n\t\treturn this._merge(globalConfig, override, config);\n\t}\n\n\t/**\n\t * @internal For testing only\n\t */\n\tpublic _getInternalCache(): Map<string, Config | null> {\n\t\treturn this.cache;\n\t}\n\n\tprotected defaultConfig(): Config | Promise<Config> {\n\t\treturn Config.defaultConfig();\n\t}\n}\n","/* istanbul ignore file */\n\nimport { type FlatConfig } from \"./flat-config\";\n\n/**\n * Helper function to assist IDE with completion and type-checking.\n *\n * @example\n *\n * ```ts\n * import { defineFlatConfig } from \"html-validate\";\n *\n * export default defineFlatConfig([\n * {\n * files: [\"*.html\"],\n * rules: { \"void-style\": \"error\" },\n * }\n * ]);\n * ```\n *\n * @public\n * @since 11.5.0\n */\nexport function defineFlatConfig(config: FlatConfig): FlatConfig {\n\treturn config;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nconst FLAT_CONFIG_FILES = [\n\t\"html-validate.config.mjs\",\n\t\"html-validate.config.cjs\",\n\t\"html-validate.config.js\",\n\t\"html-validate.config.mts\",\n\t\"html-validate.config.cts\",\n\t\"html-validate.config.ts\",\n];\n\n/**\n * Traverse upward from `startDir` looking for a flat config file.\n *\n * Returns the absolute path to the first match, or `null` if none is found.\n *\n * @internal\n */\nexport function findFlatConfigFile(startDir: string): string | null {\n\tlet current = path.resolve(startDir);\n\tconst root = path.parse(current).root;\n\n\tfor (;;) {\n\t\tfor (const filename of FLAT_CONFIG_FILES) {\n\t\t\tconst candidate = path.join(current, filename);\n\t\t\tif (fs.existsSync(candidate)) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\n\t\tconst parent = path.dirname(current);\n\t\tif (current === root || parent === current) {\n\t\t\treturn null;\n\t\t}\n\t\tcurrent = parent;\n\t}\n}\n","import fs from \"node:fs/promises\";\nimport { pathToFileURL } from \"node:url\";\nimport { type FlatConfig } from \"./flat-config\";\n\nexport async function loadFlatConfigFile(filePath: string): Promise<FlatConfig> {\n\tconst url = pathToFileURL(filePath);\n\tconst stat = await fs.stat(url);\n\turl.searchParams.append(\"mtime\", String(stat.mtime.getTime()));\n\tconst module = (await import(url.href)) as { default?: unknown };\n\tconst value = module.default;\n\n\tif (!Array.isArray(value)) {\n\t\tthrow new TypeError(\n\t\t\t`Flat config file \"${filePath}\" must have a default export that is an array`,\n\t\t);\n\t}\n\n\treturn value as FlatConfig;\n}\n","import { type FlatConfigObject } from \"./flat-config\";\n\n/**\n * The merged result of {@link mergeFlatConfig}.\n *\n * @internal\n */\nexport type MergedFlatConfig = Required<\n\tPick<FlatConfigObject, \"elements\" | \"plugins\" | \"transform\" | \"rules\">\n>;\n\n/**\n * Merge an array of {@link FlatConfigObject} objects into a single object.\n *\n * - `elements` and `plugins` arrays are concatenated (in order).\n * - `transform` and `rules` objects are shallow-merged (later block wins on\n * key conflict).\n *\n * @internal\n */\nexport function mergeFlatConfig(blocks: FlatConfigObject[]): MergedFlatConfig {\n\tconst merged: MergedFlatConfig = {\n\t\telements: [],\n\t\tplugins: [],\n\t\ttransform: {},\n\t\trules: {},\n\t};\n\n\tfor (const block of blocks) {\n\t\tif (block.elements) {\n\t\t\tmerged.elements = [...merged.elements, ...block.elements];\n\t\t}\n\t\tif (block.plugins) {\n\t\t\tmerged.plugins = [...merged.plugins, ...block.plugins];\n\t\t}\n\t\tif (block.transform) {\n\t\t\tmerged.transform = { ...merged.transform, ...block.transform };\n\t\t}\n\t\tif (block.rules) {\n\t\t\tmerged.rules = { ...merged.rules, ...block.rules };\n\t\t}\n\t}\n\n\treturn merged;\n}\n","import path from \"node:path\";\nimport { type Config } from \"../config/config\";\nimport { type ConfigData, type RuleOptions, type RuleSeverity } from \"../config/config-data\";\nimport { ConfigLoader } from \"../config/config-loader\";\nimport { ResolvedConfig } from \"../config/resolved-config\";\nimport { type Resolver } from \"../config/resolver\";\nimport { esmResolver } from \"../config/resolver/nodejs\";\nimport { type Severity, parseSeverity } from \"../config/severity\";\nimport { type MetaDataTable, MetaTable } from \"../meta\";\nimport { type TransformerEntry } from \"../transform\";\nimport { findFlatConfigFile } from \"./find-flat-config-file\";\nimport { type FlatConfig, type FlatConfigObject } from \"./flat-config\";\nimport { loadFlatConfigFile } from \"./load-flat-config-file\";\nimport { type MergedFlatConfig, mergeFlatConfig } from \"./merge-flat-config\";\n\nfunction isGlobalIgnore(block: FlatConfigObject): block is { ignores: string[] } {\n\treturn (\n\t\tblock.ignores !== undefined &&\n\t\tblock.files === undefined &&\n\t\tblock.elements === undefined &&\n\t\tblock.plugins === undefined &&\n\t\tblock.transform === undefined &&\n\t\tblock.rules === undefined\n\t);\n}\n\nfunction matchesFile(block: FlatConfigObject, rel: string): boolean {\n\tif (block.ignores?.some((it) => path.matchesGlob(rel, it))) {\n\t\treturn false;\n\t}\n\n\tif (!block.files) {\n\t\treturn true;\n\t}\n\n\t/* patterns without a path separator are treated as matching anywhere in\n\t * the tree */\n\treturn block.files.some((it) => path.matchesGlob(rel, it.includes(\"/\") ? it : `**/${it}`));\n}\n\nfunction configDataToFlatConfigObject(data: ConfigData | undefined): FlatConfigObject {\n\tif (!data) {\n\t\treturn {};\n\t}\n\n\tconst elements = data.elements?.filter((it) => typeof it !== \"string\");\n\tconst plugins = data.plugins?.filter((it) => typeof it !== \"string\");\n\tconst rules = data.rules;\n\n\treturn {\n\t\telements: elements as MetaDataTable[],\n\t\tplugins,\n\t\trules,\n\t};\n}\n\nfunction buildResolvedConfig(merged: MergedFlatConfig, original: FlatConfig): ResolvedConfig {\n\tconst metaTable = new MetaTable();\n\tfor (const element of merged.elements) {\n\t\tmetaTable.loadFromObject(element);\n\t}\n\tmetaTable.init();\n\n\tconst plugins = merged.plugins;\n\n\tconst rules = new Map<string, [Severity, RuleOptions]>();\n\tfor (const [ruleId, data] of Object.entries(merged.rules)) {\n\t\tlet rawSeverity: RuleSeverity;\n\t\tlet options: RuleOptions;\n\t\tif (!Array.isArray(data)) {\n\t\t\trawSeverity = data;\n\t\t\toptions = {};\n\t\t} else if (data.length === 1) {\n\t\t\trawSeverity = data[0];\n\t\t\toptions = {};\n\t\t} else {\n\t\t\trawSeverity = data[0];\n\t\t\toptions = data[1];\n\t\t}\n\t\trules.set(ruleId, [parseSeverity(rawSeverity), options]);\n\t}\n\n\tconst transformers: TransformerEntry[] = Object.entries(merged.transform).map(\n\t\t/* eslint-disable-next-line security/detect-non-literal-regexp -- transform patterns are user-provided regexp strings */\n\t\t([pattern, fn]) => ({ kind: \"function\" as const, pattern: new RegExp(pattern), function: fn }),\n\t);\n\n\tconst resolvedData = { metaTable, plugins, rules, transformers };\n\treturn new ResolvedConfig(resolvedData, original);\n}\n\nconst defaultResolvers: Resolver[] = [esmResolver()];\n\n/**\n * Configuration loader for the flat config format.\n *\n * Loads configuration from a `html-validate.config.*` file and applies\n * per-file glob filtering.\n *\n * @public\n * @since 11.5.0\n */\nexport class FlatConfigLoader extends ConfigLoader {\n\tprivate readonly configFilePath: string;\n\tprivate configCache: {\n\t\t/** all configuration blocks except global ignores */\n\t\tflatConfig: FlatConfigObject[];\n\t\t/** global ignore patterns */\n\t\tglobalIgnores: string[];\n\t} | null;\n\tprivate fileCache: Map<string, ResolvedConfig>;\n\n\t/**\n\t * @param configFilePath - Absolute path to the flat config file.\n\t * @param resolvers - Resolvers to use.\n\t */\n\tpublic constructor(configFilePath: string, resolvers: Resolver[] = defaultResolvers) {\n\t\tsuper(resolvers);\n\t\tthis.configFilePath = configFilePath;\n\t\tthis.configCache = null;\n\t\tthis.fileCache = new Map();\n\t}\n\n\t/**\n\t * Search `dir` and its ancestors for a flat config file and, if found,\n\t * return a new `FlatConfigLoader` pointed at it. Returns `null` when no\n\t * config file can be found.\n\t *\n\t * @param dir - Directory to start searching from.\n\t * @param resolvers - Resolvers to use.\n\t */\n\tpublic static fromDirectory(dir: string, resolvers?: Resolver[]): FlatConfigLoader | null {\n\t\tconst configFilePath = findFlatConfigFile(dir);\n\t\tif (!configFilePath) {\n\t\t\treturn null;\n\t\t}\n\t\treturn new FlatConfigLoader(configFilePath, resolvers);\n\t}\n\n\t/**\n\t * Get configuration for the given filename.\n\t *\n\t * Do note that if `configOverride` is changed between calls the cache must be\n\t * flushed in-between. This loader caches the final merged result.\n\t *\n\t * @param filename - Absolute or relative path to the file being validated.\n\t * @param configOverride - Optional configuration to merge into the result.\n\t */\n\tpublic override async getConfigFor(\n\t\tfilename: string,\n\t\tconfigOverride?: ConfigData,\n\t): Promise<ResolvedConfig> {\n\t\tconst cached = this.fileCache.get(filename);\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst { flatConfig, globalIgnores } = await this.loadConfig();\n\t\tconst configDir = path.dirname(this.configFilePath);\n\t\tconst rel = path.relative(configDir, path.resolve(filename));\n\n\t\t/* normally `getConfigFor()` shouldn't be called for an ignored file but if\n\t\t * it happens we just return an empty config */\n\t\tif (globalIgnores.some((p) => path.matchesGlob(rel, p))) {\n\t\t\treturn buildResolvedConfig({ elements: [], plugins: [], transform: {}, rules: {} }, []);\n\t\t}\n\n\t\t/* convert the override to a flat config block */\n\t\tconst overrideBlock = configDataToFlatConfigObject(configOverride);\n\n\t\t/* find and merge all matching blocks for this filename */\n\t\tconst matchingBlocks = flatConfig.filter((block) => matchesFile(block, rel));\n\t\tconst blocks = [...matchingBlocks, overrideBlock];\n\t\tconst merged = mergeFlatConfig(blocks);\n\n\t\t/* resolve and cache result */\n\t\tconst resolved = buildResolvedConfig(merged, blocks);\n\t\tthis.fileCache.set(filename, resolved);\n\t\treturn resolved;\n\t}\n\n\t/**\n\t * Flush the cached flat config, forcing a reload on the next call.\n\t */\n\tpublic override flushCache(handle?: string): void {\n\t\tif (handle) {\n\t\t\tthis.fileCache.delete(handle);\n\t\t} else {\n\t\t\tthis.configCache = null;\n\t\t\tthis.fileCache = new Map();\n\t\t}\n\t}\n\n\t/* istanbul ignore next */\n\tprotected override defaultConfig(): Config {\n\t\treturn this.empty();\n\t}\n\n\tprivate async loadConfig(): Promise<{ flatConfig: FlatConfig; globalIgnores: string[] }> {\n\t\tif (this.configCache) {\n\t\t\treturn this.configCache;\n\t\t}\n\n\t\tconst raw = await loadFlatConfigFile(this.configFilePath);\n\t\tconst flatConfig = raw.filter((block) => !isGlobalIgnore(block));\n\t\tconst globalIgnores = raw.filter(isGlobalIgnore).flatMap((block) => block.ignores);\n\n\t\tthis.configCache = { flatConfig, globalIgnores };\n\t\treturn this.configCache;\n\t}\n}\n","import kleur from \"kleur\";\nimport { version } from \"../generated/package-json\";\nimport { type CompatibilityOptions, compatibilityCheckImpl } from \"./compatibility-check\";\n\nconst defaults: CompatibilityOptions = {\n\tsilent: false,\n\tversion,\n\tlogger(text: string): void {\n\t\t/* eslint-disable-next-line no-console -- expected to log */\n\t\tconsole.error(kleur.red(text));\n\t},\n};\n\n/**\n * Tests if plugin is compatible with html-validate library. Unless the `silent`\n * option is used a warning is displayed on the console.\n *\n * @public\n * @since v5.0.0\n * @param name - Name of plugin\n * @param declared - What library versions the plugin support (e.g. declared peerDependencies)\n * @returns - `true` if version is compatible\n */\nexport function compatibilityCheck(\n\tname: string,\n\tdeclared: string,\n\toptions?: Partial<CompatibilityOptions>,\n): boolean {\n\treturn compatibilityCheckImpl(name, declared, {\n\t\t...defaults,\n\t\t...options,\n\t});\n}\n"],"names":["fs","ConfigLoader","StaticConfigLoader","PerformanceTracker","normalizeSource","transformSource","Engine","Parser","transformSourceSync","transformFilename","transformFilenameSync","Reporter","configurationSchema","isThenable","UserError","path","isTransformer","options","ConfigError","existsSync","pathToFileURL","defaultResolvers","override","merged","globalConfig","config","Config","MetaTable","parseSeverity","ResolvedConfig","version","kleur","compatibilityCheckImpl"],"mappings":"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"}
package/dist/cjs/core.js CHANGED
@@ -898,6 +898,31 @@ const definitions = {
898
898
  },
899
899
  {
900
900
  regexp: true
901
+ },
902
+ {
903
+ type: "object",
904
+ title: "Named regular expression",
905
+ required: [
906
+ "name",
907
+ "pattern"
908
+ ],
909
+ additionalProperties: false,
910
+ properties: {
911
+ name: {
912
+ type: "string",
913
+ minLength: 1
914
+ },
915
+ pattern: {
916
+ anyOf: [
917
+ {
918
+ type: "string"
919
+ },
920
+ {
921
+ regexp: true
922
+ }
923
+ ]
924
+ }
925
+ }
901
926
  }
902
927
  ]
903
928
  }
@@ -1500,10 +1525,7 @@ function expandProperties(node, entry) {
1500
1525
  setMetaProperty(entry, "focusable", entry.focusable(node._adapter));
1501
1526
  }
1502
1527
  }
1503
- function expandRegexValue(value) {
1504
- if (value instanceof RegExp) {
1505
- return value;
1506
- }
1528
+ function compileRegexString(value) {
1507
1529
  const match = /^\/(.*(?=\/))\/(i?)$/.exec(value);
1508
1530
  if (match) {
1509
1531
  const [, expr, flags] = match;
@@ -1512,9 +1534,28 @@ function expandRegexValue(value) {
1512
1534
  } else {
1513
1535
  return new RegExp(`^${expr}$`, flags);
1514
1536
  }
1515
- } else {
1516
- return value;
1517
1537
  }
1538
+ return null;
1539
+ }
1540
+ function expandRegexValue(value) {
1541
+ if (value instanceof RegExp) {
1542
+ return { name: value.toString(), pattern: value };
1543
+ }
1544
+ if (typeof value === "object") {
1545
+ if (value.pattern instanceof RegExp) {
1546
+ return { name: value.name, pattern: value.pattern };
1547
+ }
1548
+ const compiled = compileRegexString(value.pattern);
1549
+ if (!compiled) {
1550
+ throw new Error(`Failed to create regular expression from "${value.pattern}"`);
1551
+ }
1552
+ return { name: value.name, pattern: compiled };
1553
+ }
1554
+ const regex = compileRegexString(value);
1555
+ if (regex) {
1556
+ return { name: regex.toString(), pattern: regex };
1557
+ }
1558
+ return value;
1518
1559
  }
1519
1560
  function expandRegex(entry) {
1520
1561
  for (const [name, values] of Object.entries(entry.attributes)) {
@@ -3332,10 +3373,14 @@ class Validator {
3332
3373
  }
3333
3374
  const caseInsensitiveValue = value.toLowerCase();
3334
3375
  return rule.enum.some((entry) => {
3335
- if (entry instanceof RegExp) {
3376
+ if (typeof entry === "string") {
3377
+ return caseInsensitiveValue === entry;
3378
+ } else if (entry instanceof RegExp) {
3336
3379
  return entry.test(value);
3380
+ } else if (entry.pattern instanceof RegExp) {
3381
+ return entry.pattern.test(value);
3337
3382
  } else {
3338
- return caseInsensitiveValue === entry;
3383
+ throw new TypeError("RegExp was not precompiled when it should have been");
3339
3384
  }
3340
3385
  });
3341
3386
  }
@@ -5406,8 +5451,10 @@ class AttributeAllowedValues extends Rule {
5406
5451
  const allowedList = allowed.enum.map((value2) => {
5407
5452
  if (typeof value2 === "string") {
5408
5453
  return `- \`"${value2}"\``;
5409
- } else {
5454
+ } else if (value2 instanceof RegExp) {
5410
5455
  return `- \`${value2.toString()}\``;
5456
+ } else {
5457
+ return `- ${value2.name}`;
5411
5458
  }
5412
5459
  });
5413
5460
  docs.description = [
@@ -11882,7 +11929,8 @@ class ResolvedConfig {
11882
11929
  /**
11883
11930
  * @internal
11884
11931
  */
11885
- constructor({ metaTable, plugins, rules, transformers }, original) {
11932
+ constructor(options, original) {
11933
+ const { metaTable, plugins, rules, transformers } = options;
11886
11934
  this.metaTable = metaTable;
11887
11935
  this.plugins = plugins;
11888
11936
  this.rules = rules;
@@ -12784,7 +12832,7 @@ class EventHandler {
12784
12832
  }
12785
12833
 
12786
12834
  const name = "html-validate";
12787
- const version = "11.4.0";
12835
+ const version = "11.5.0";
12788
12836
  const bugs = "https://gitlab.com/html-validate/html-validate/issues/new";
12789
12837
 
12790
12838
  function freeze(src) {
@@ -15491,7 +15539,7 @@ var ignoreExports = /*@__PURE__*/ requireIgnore();
15491
15539
  var ignore = /*@__PURE__*/getDefaultExportFromCjs(ignoreExports);
15492
15540
 
15493
15541
  const engines = {
15494
- node: "^22.17.0 || >= 24.0.0"
15542
+ node: "^22.22.0 || >= 24.8.0"
15495
15543
  };
15496
15544
 
15497
15545
  var jestWorkerPath = "./jest-worker.js";
@@ -15531,6 +15579,12 @@ exports.bugs = bugs;
15531
15579
  exports.classifyNodeText = classifyNodeText;
15532
15580
  exports.codeFrameColumns = codeFrameColumns;
15533
15581
  exports.compatibilityCheckImpl = compatibilityCheckImpl;
15582
+ exports.config = config$5;
15583
+ exports.config$1 = config$4;
15584
+ exports.config$2 = config$3;
15585
+ exports.config$3 = config$2;
15586
+ exports.config$4 = config$1;
15587
+ exports.config$5 = config;
15534
15588
  exports.configurationSchema = configurationSchema;
15535
15589
  exports.deepmerge = deepmerge;
15536
15590
  exports.defineConfig = defineConfig;
@@ -15547,6 +15601,7 @@ exports.jestWorkerPath = jestWorkerPath;
15547
15601
  exports.keywordPatternMatcher = keywordPatternMatcher;
15548
15602
  exports.name = name;
15549
15603
  exports.normalizeSource = normalizeSource;
15604
+ exports.parseSeverity = parseSeverity;
15550
15605
  exports.presets = presets;
15551
15606
  exports.ruleExists = ruleExists;
15552
15607
  exports.sliceLocation = sliceLocation;