html-validate 10.12.1 → 10.13.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.
Files changed (44) hide show
  1. package/dist/cjs/browser.js +1 -0
  2. package/dist/cjs/browser.js.map +1 -1
  3. package/dist/cjs/core.js +13 -6
  4. package/dist/cjs/core.js.map +1 -1
  5. package/dist/cjs/elements.js +11 -2
  6. package/dist/cjs/elements.js.map +1 -1
  7. package/dist/cjs/html-validate.js +1 -0
  8. package/dist/cjs/html-validate.js.map +1 -1
  9. package/dist/cjs/html5.js +1 -0
  10. package/dist/cjs/html5.js.map +1 -1
  11. package/dist/cjs/index.js +1 -0
  12. package/dist/cjs/index.js.map +1 -1
  13. package/dist/cjs/jest-worker.js +1 -0
  14. package/dist/cjs/jest-worker.js.map +1 -1
  15. package/dist/cjs/jest.js +1 -0
  16. package/dist/cjs/jest.js.map +1 -1
  17. package/dist/cjs/utils/parse-image-candidate-string.js +38 -0
  18. package/dist/cjs/utils/parse-image-candidate-string.js.map +1 -0
  19. package/dist/cjs/vitest.js +1 -0
  20. package/dist/cjs/vitest.js.map +1 -1
  21. package/dist/esm/browser.js +1 -0
  22. package/dist/esm/browser.js.map +1 -1
  23. package/dist/esm/core.js +13 -6
  24. package/dist/esm/core.js.map +1 -1
  25. package/dist/esm/elements.js +11 -2
  26. package/dist/esm/elements.js.map +1 -1
  27. package/dist/esm/html-validate.js +1 -0
  28. package/dist/esm/html-validate.js.map +1 -1
  29. package/dist/esm/html5.js +1 -0
  30. package/dist/esm/html5.js.map +1 -1
  31. package/dist/esm/index.js +1 -0
  32. package/dist/esm/index.js.map +1 -1
  33. package/dist/esm/jest-worker.js +1 -0
  34. package/dist/esm/jest-worker.js.map +1 -1
  35. package/dist/esm/jest.js +1 -0
  36. package/dist/esm/jest.js.map +1 -1
  37. package/dist/esm/utils/parse-image-candidate-string.js +36 -0
  38. package/dist/esm/utils/parse-image-candidate-string.js.map +1 -0
  39. package/dist/esm/vitest.js +1 -0
  40. package/dist/esm/vitest.js.map +1 -1
  41. package/dist/schema/elements.json +6 -0
  42. package/dist/types/browser.d.ts +9 -0
  43. package/dist/types/index.d.ts +9 -0
  44. package/package.json +2 -2
@@ -10,6 +10,7 @@ require('ajv');
10
10
  require('./elements.js');
11
11
  require('./meta-helper.js');
12
12
  require('./utils/natural-join.js');
13
+ require('./utils/parse-image-candidate-string.js');
13
14
  require('@sidvind/better-ajv-errors');
14
15
  require('@html-validate/stylish');
15
16
  require('semver');
@@ -1 +1 @@
1
- {"version":3,"file":"html-validate.js","sources":["../../src/cli/html-validate.ts"],"sourcesContent":["/* eslint-disable no-console, n/no-process-exit -- as expected from a cli app */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport kleur from \"kleur\";\nimport minimist from \"minimist\";\nimport { type UserErrorData, SchemaValidationError, isUserError } from \"..\";\nimport { bugs as pkgBugs, name, version } from \"../generated/package-json\";\nimport { dump } from \"./actions/dump\";\nimport { init } from \"./actions/init\";\nimport { lint } from \"./actions/lint\";\nimport { printConfig } from \"./actions/print-config\";\nimport { CLI } from \"./cli\";\nimport { ImportResolveMissingError, handleSchemaValidationError } from \"./errors\";\nimport { haveImportMetaResolve } from \"./have-import-meta-resolve\";\nimport { Mode, modeToFlag } from \"./mode\";\n\ninterface ParsedArgs {\n\tconfig?: string;\n\t\"dump-events\": boolean;\n\t\"dump-source\": boolean;\n\t\"dump-tokens\": boolean;\n\t\"dump-tree\": boolean;\n\text: string;\n\tformatter: string;\n\thelp: boolean;\n\tinit: boolean;\n\t\"max-warnings\"?: string;\n\tpreset?: string;\n\t\"print-config\": boolean;\n\trule?: string;\n\tstdin: boolean;\n\t\"stdin-filename\"?: string;\n\tversion: boolean;\n}\n\nfunction getMode(argv: Record<string, unknown>): Mode {\n\tif (argv[\"init\"]) {\n\t\treturn Mode.INIT;\n\t}\n\n\tif (argv[\"dump-events\"]) {\n\t\treturn Mode.DUMP_EVENTS;\n\t}\n\n\tif (argv[\"dump-source\"]) {\n\t\treturn Mode.DUMP_SOURCE;\n\t}\n\n\tif (argv[\"dump-tokens\"]) {\n\t\treturn Mode.DUMP_TOKENS;\n\t}\n\n\tif (argv[\"dump-tree\"]) {\n\t\treturn Mode.DUMP_TREE;\n\t}\n\n\tif (argv[\"print-config\"]) {\n\t\treturn Mode.PRINT_CONFIG;\n\t}\n\n\treturn Mode.LINT;\n}\n\nfunction requiresFilename(mode: Mode): boolean {\n\tswitch (mode) {\n\t\tcase Mode.LINT:\n\t\t\treturn true;\n\t\tcase Mode.INIT:\n\t\t\treturn false;\n\t\tcase Mode.DUMP_EVENTS:\n\t\tcase Mode.DUMP_TOKENS:\n\t\tcase Mode.DUMP_TREE:\n\t\tcase Mode.DUMP_SOURCE:\n\t\tcase Mode.PRINT_CONFIG:\n\t\t\treturn true;\n\t}\n}\n\nfunction handleUserError(err: UserErrorData): void {\n\tconst formatted = err.prettyFormat();\n\tif (formatted) {\n\t\tconsole.error(); /* blank line */\n\t\tconsole.error(formatted);\n\t\treturn;\n\t}\n\n\tconsole.error(kleur.red(\"Caught exception:\"));\n\tconsole.group();\n\t{\n\t\tconsole.error(err.prettyFormat() ?? err);\n\t}\n\tconsole.groupEnd();\n}\n\nfunction handleUnknownError(err: unknown): void {\n\tconsole.error(kleur.red(\"Caught exception:\"));\n\tconsole.group();\n\t{\n\t\tconsole.error(err);\n\t}\n\tconsole.groupEnd();\n\tconst bugUrl = `${pkgBugs}?issuable_template=Bug`;\n\tconsole.error(kleur.red(`This is a bug in ${name}-${version}.`));\n\tconsole.error(\n\t\tkleur.red(\n\t\t\t[\n\t\t\t\t`Please file a bug at ${bugUrl}`,\n\t\t\t\t`and include this message in full and if possible the content of the`,\n\t\t\t\t`file being parsed (or a reduced testcase).`,\n\t\t\t].join(\"\\n\"),\n\t\t),\n\t);\n}\n\nconst argv = minimist<ParsedArgs>(process.argv.slice(2), {\n\tstring: [\n\t\t\"c\",\n\t\t\"config\",\n\t\t\"ext\",\n\t\t\"f\",\n\t\t\"formatter\",\n\t\t\"max-warnings\",\n\t\t\"p\",\n\t\t\"preset\",\n\t\t\"rule\",\n\t\t\"stdin-filename\",\n\t],\n\tboolean: [\n\t\t\"init\",\n\t\t\"dump-events\",\n\t\t\"dump-source\",\n\t\t\"dump-tokens\",\n\t\t\"dump-tree\",\n\t\t\"h\",\n\t\t\"help\",\n\t\t\"print-config\",\n\t\t\"stdin\",\n\t\t\"version\",\n\t],\n\talias: {\n\t\tc: \"config\",\n\t\tf: \"formatter\",\n\t\tp: \"preset\",\n\t\th: \"help\",\n\t},\n\tdefault: {\n\t\text: \"html\",\n\t\tformatter: \"stylish\",\n\t},\n\tunknown: (opt: string) => {\n\t\tif (opt.startsWith(\"-\")) {\n\t\t\tprocess.stderr.write(`unknown option ${opt}\\n`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn true;\n\t},\n});\n\nfunction showUsage(): void {\n\tprocess.stdout.write(`${name}-${version}\nUsage: html-validate [OPTIONS] [FILENAME..] [DIR..]\n\nCommon options:\n --ext=STRING specify file extensions (commaseparated).\n -f, --formatter=FORMATTER specify the formatter to use.\n --max-warnings=INT number of warnings to trigger nonzero exit code\n -p, --preset=STRING configuration preset to use, use\n comma-separator for multiple presets. (default:\n \"recommended\")\n --rule=RULE:SEVERITY set additional rule, use comma separator for\n multiple.\n --stdin process markup from stdin.\n --stdin-filename=STRING specify filename to report when using stdin\n\nMiscellaneous:\n -c, --config=STRING use custom configuration file.\n --init initialize project with a new configuration\n --print-config output configuration for given file.\n -h, --help show help.\n --version show version.\n\nDebugging options:\n --dump-events output events during parsing.\n --dump-source output post-transformed source data.\n --dump-tokens output tokens from lexing stage.\n --dump-tree output nodes from the dom tree.\n\nFormatters:\n\nMultiple formatters can be specified with a comma-separated list,\ne.g. \"json,checkstyle\" to enable both.\n\nTo capture output to a file use \"formatter=/path/to/file\",\ne.g. \"checkstyle=dist/html-validate.xml\"\n`);\n}\n\nfunction showVersion(): void {\n\tprocess.stdout.write(`${name}-${version}\\n`);\n}\n\nif (argv.stdin) {\n\targv._.push(\"-\");\n}\n\nif (argv.version) {\n\tshowVersion();\n\tprocess.exit();\n}\n\nif (argv.help) {\n\tshowUsage();\n\tprocess.exit();\n}\n\nif (argv._.length === 0) {\n\tconst mode = getMode(argv);\n\tif (mode === Mode.LINT) {\n\t\tshowUsage();\n\t\tprocess.exit(0);\n\t} else if (requiresFilename(mode)) {\n\t\tconst flag = modeToFlag(mode);\n\t\tconsole.error(`\\`${flag}\\` requires a filename.`);\n\t\tprocess.exit(1);\n\t}\n}\n\n/* check that supplied config file exists before creating CLI */\nif (argv.config !== undefined) {\n\tconst checkPath = path.resolve(argv.config);\n\tif (!fs.existsSync(checkPath)) {\n\t\tconsole.error(`The file \"${argv.config}\" was not found.`);\n\t\tconsole.error(`The location this file was checked for at was: \"${checkPath}\"`);\n\t\tprocess.exit(1);\n\t}\n}\n\n/* eslint-disable-next-line complexity -- for now */\nasync function run(): Promise<void> {\n\tconst cli = new CLI({\n\t\tconfigFile: argv.config,\n\t\tpreset: argv.preset,\n\t\trules: argv.rule,\n\t});\n\tconst mode = getMode(argv);\n\tconst formatter = await cli.getFormatter(argv.formatter);\n\tconst maxWarnings = Number.parseInt(argv[\"max-warnings\"] ?? \"-1\", 10);\n\tconst htmlvalidate = await cli.getValidator();\n\n\t/* sanity check: ensure maxWarnings has a valid value */\n\tif (Number.isNaN(maxWarnings)) {\n\t\tconsole.error(`Invalid value \"${String(argv[\"max-warnings\"])}\" given to --max-warnings`);\n\t\tprocess.exit(1);\n\t}\n\n\t/* parse extensions (used when expanding directories) */\n\tconst extensions = argv.ext.split(\",\").map((cur: string) => {\n\t\treturn cur.startsWith(\".\") ? cur.slice(1) : cur;\n\t});\n\n\tconst files = await cli.expandFiles(argv._, { extensions });\n\tif (files.length === 0 && mode !== Mode.INIT) {\n\t\tconsole.error(\"No files matching patterns\", argv._);\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\t/* istanbul ignore next -- not tested with unittests */\n\t\tif (!haveImportMetaResolve()) {\n\t\t\tthrow new ImportResolveMissingError();\n\t\t}\n\n\t\tlet success: boolean;\n\t\tswitch (mode) {\n\t\t\tcase Mode.LINT: {\n\t\t\t\tsuccess = await lint(htmlvalidate, process.stdout, files, {\n\t\t\t\t\tformatter,\n\t\t\t\t\tmaxWarnings,\n\t\t\t\t\tstdinFilename: argv[\"stdin-filename\"] ?? false,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase Mode.INIT: {\n\t\t\t\tsuccess = await init(cli, process.stdout, { cwd: process.cwd() });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase Mode.PRINT_CONFIG: {\n\t\t\t\tsuccess = await printConfig(htmlvalidate, process.stdout, files);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tsuccess = await dump(htmlvalidate, process.stdout, files, mode);\n\t\t\t}\n\t\t}\n\t\tprocess.exit(success ? 0 : 1);\n\t} catch (err) {\n\t\tif (err instanceof SchemaValidationError) {\n\t\t\thandleSchemaValidationError(console, err);\n\t\t} else if (isUserError(err)) {\n\t\t\thandleUserError(err);\n\t\t} else {\n\t\t\thandleUnknownError(err);\n\t\t}\n\t\tprocess.exit(1);\n\t}\n}\n\n/* eslint-disable-next-line unicorn/prefer-top-level-await -- technical debt, as long as we bundle and ship commonjs we cannot use TLA here */\nrun().catch((err: unknown) => {\n\tconsole.error(err);\n\tprocess.exit(1);\n});\n"],"names":["argv","Mode","kleur","pkgBugs","name","version","minimist","modeToFlag","path","fs","cli","CLI","haveImportMetaResolve","ImportResolveMissingError","lint","init","printConfig","dump","SchemaValidationError","handleSchemaValidationError","isUserError"],"mappings":"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"}
1
+ {"version":3,"file":"html-validate.js","sources":["../../src/cli/html-validate.ts"],"sourcesContent":["/* eslint-disable no-console, n/no-process-exit -- as expected from a cli app */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport kleur from \"kleur\";\nimport minimist from \"minimist\";\nimport { type UserErrorData, SchemaValidationError, isUserError } from \"..\";\nimport { bugs as pkgBugs, name, version } from \"../generated/package-json\";\nimport { dump } from \"./actions/dump\";\nimport { init } from \"./actions/init\";\nimport { lint } from \"./actions/lint\";\nimport { printConfig } from \"./actions/print-config\";\nimport { CLI } from \"./cli\";\nimport { ImportResolveMissingError, handleSchemaValidationError } from \"./errors\";\nimport { haveImportMetaResolve } from \"./have-import-meta-resolve\";\nimport { Mode, modeToFlag } from \"./mode\";\n\ninterface ParsedArgs {\n\tconfig?: string;\n\t\"dump-events\": boolean;\n\t\"dump-source\": boolean;\n\t\"dump-tokens\": boolean;\n\t\"dump-tree\": boolean;\n\text: string;\n\tformatter: string;\n\thelp: boolean;\n\tinit: boolean;\n\t\"max-warnings\"?: string;\n\tpreset?: string;\n\t\"print-config\": boolean;\n\trule?: string;\n\tstdin: boolean;\n\t\"stdin-filename\"?: string;\n\tversion: boolean;\n}\n\nfunction getMode(argv: Record<string, unknown>): Mode {\n\tif (argv[\"init\"]) {\n\t\treturn Mode.INIT;\n\t}\n\n\tif (argv[\"dump-events\"]) {\n\t\treturn Mode.DUMP_EVENTS;\n\t}\n\n\tif (argv[\"dump-source\"]) {\n\t\treturn Mode.DUMP_SOURCE;\n\t}\n\n\tif (argv[\"dump-tokens\"]) {\n\t\treturn Mode.DUMP_TOKENS;\n\t}\n\n\tif (argv[\"dump-tree\"]) {\n\t\treturn Mode.DUMP_TREE;\n\t}\n\n\tif (argv[\"print-config\"]) {\n\t\treturn Mode.PRINT_CONFIG;\n\t}\n\n\treturn Mode.LINT;\n}\n\nfunction requiresFilename(mode: Mode): boolean {\n\tswitch (mode) {\n\t\tcase Mode.LINT:\n\t\t\treturn true;\n\t\tcase Mode.INIT:\n\t\t\treturn false;\n\t\tcase Mode.DUMP_EVENTS:\n\t\tcase Mode.DUMP_TOKENS:\n\t\tcase Mode.DUMP_TREE:\n\t\tcase Mode.DUMP_SOURCE:\n\t\tcase Mode.PRINT_CONFIG:\n\t\t\treturn true;\n\t}\n}\n\nfunction handleUserError(err: UserErrorData): void {\n\tconst formatted = err.prettyFormat();\n\tif (formatted) {\n\t\tconsole.error(); /* blank line */\n\t\tconsole.error(formatted);\n\t\treturn;\n\t}\n\n\tconsole.error(kleur.red(\"Caught exception:\"));\n\tconsole.group();\n\t{\n\t\tconsole.error(err.prettyFormat() ?? err);\n\t}\n\tconsole.groupEnd();\n}\n\nfunction handleUnknownError(err: unknown): void {\n\tconsole.error(kleur.red(\"Caught exception:\"));\n\tconsole.group();\n\t{\n\t\tconsole.error(err);\n\t}\n\tconsole.groupEnd();\n\tconst bugUrl = `${pkgBugs}?issuable_template=Bug`;\n\tconsole.error(kleur.red(`This is a bug in ${name}-${version}.`));\n\tconsole.error(\n\t\tkleur.red(\n\t\t\t[\n\t\t\t\t`Please file a bug at ${bugUrl}`,\n\t\t\t\t`and include this message in full and if possible the content of the`,\n\t\t\t\t`file being parsed (or a reduced testcase).`,\n\t\t\t].join(\"\\n\"),\n\t\t),\n\t);\n}\n\nconst argv = minimist<ParsedArgs>(process.argv.slice(2), {\n\tstring: [\n\t\t\"c\",\n\t\t\"config\",\n\t\t\"ext\",\n\t\t\"f\",\n\t\t\"formatter\",\n\t\t\"max-warnings\",\n\t\t\"p\",\n\t\t\"preset\",\n\t\t\"rule\",\n\t\t\"stdin-filename\",\n\t],\n\tboolean: [\n\t\t\"init\",\n\t\t\"dump-events\",\n\t\t\"dump-source\",\n\t\t\"dump-tokens\",\n\t\t\"dump-tree\",\n\t\t\"h\",\n\t\t\"help\",\n\t\t\"print-config\",\n\t\t\"stdin\",\n\t\t\"version\",\n\t],\n\talias: {\n\t\tc: \"config\",\n\t\tf: \"formatter\",\n\t\tp: \"preset\",\n\t\th: \"help\",\n\t},\n\tdefault: {\n\t\text: \"html\",\n\t\tformatter: \"stylish\",\n\t},\n\tunknown: (opt: string) => {\n\t\tif (opt.startsWith(\"-\")) {\n\t\t\tprocess.stderr.write(`unknown option ${opt}\\n`);\n\t\t\tprocess.exit(1);\n\t\t}\n\t\treturn true;\n\t},\n});\n\nfunction showUsage(): void {\n\tprocess.stdout.write(`${name}-${version}\nUsage: html-validate [OPTIONS] [FILENAME..] [DIR..]\n\nCommon options:\n --ext=STRING specify file extensions (commaseparated).\n -f, --formatter=FORMATTER specify the formatter to use.\n --max-warnings=INT number of warnings to trigger nonzero exit code\n -p, --preset=STRING configuration preset to use, use\n comma-separator for multiple presets. (default:\n \"recommended\")\n --rule=RULE:SEVERITY set additional rule, use comma separator for\n multiple.\n --stdin process markup from stdin.\n --stdin-filename=STRING specify filename to report when using stdin\n\nMiscellaneous:\n -c, --config=STRING use custom configuration file.\n --init initialize project with a new configuration\n --print-config output configuration for given file.\n -h, --help show help.\n --version show version.\n\nDebugging options:\n --dump-events output events during parsing.\n --dump-source output post-transformed source data.\n --dump-tokens output tokens from lexing stage.\n --dump-tree output nodes from the dom tree.\n\nFormatters:\n\nMultiple formatters can be specified with a comma-separated list,\ne.g. \"json,checkstyle\" to enable both.\n\nTo capture output to a file use \"formatter=/path/to/file\",\ne.g. \"checkstyle=dist/html-validate.xml\"\n`);\n}\n\nfunction showVersion(): void {\n\tprocess.stdout.write(`${name}-${version}\\n`);\n}\n\nif (argv.stdin) {\n\targv._.push(\"-\");\n}\n\nif (argv.version) {\n\tshowVersion();\n\tprocess.exit();\n}\n\nif (argv.help) {\n\tshowUsage();\n\tprocess.exit();\n}\n\nif (argv._.length === 0) {\n\tconst mode = getMode(argv);\n\tif (mode === Mode.LINT) {\n\t\tshowUsage();\n\t\tprocess.exit(0);\n\t} else if (requiresFilename(mode)) {\n\t\tconst flag = modeToFlag(mode);\n\t\tconsole.error(`\\`${flag}\\` requires a filename.`);\n\t\tprocess.exit(1);\n\t}\n}\n\n/* check that supplied config file exists before creating CLI */\nif (argv.config !== undefined) {\n\tconst checkPath = path.resolve(argv.config);\n\tif (!fs.existsSync(checkPath)) {\n\t\tconsole.error(`The file \"${argv.config}\" was not found.`);\n\t\tconsole.error(`The location this file was checked for at was: \"${checkPath}\"`);\n\t\tprocess.exit(1);\n\t}\n}\n\n/* eslint-disable-next-line complexity -- for now */\nasync function run(): Promise<void> {\n\tconst cli = new CLI({\n\t\tconfigFile: argv.config,\n\t\tpreset: argv.preset,\n\t\trules: argv.rule,\n\t});\n\tconst mode = getMode(argv);\n\tconst formatter = await cli.getFormatter(argv.formatter);\n\tconst maxWarnings = Number.parseInt(argv[\"max-warnings\"] ?? \"-1\", 10);\n\tconst htmlvalidate = await cli.getValidator();\n\n\t/* sanity check: ensure maxWarnings has a valid value */\n\tif (Number.isNaN(maxWarnings)) {\n\t\tconsole.error(`Invalid value \"${String(argv[\"max-warnings\"])}\" given to --max-warnings`);\n\t\tprocess.exit(1);\n\t}\n\n\t/* parse extensions (used when expanding directories) */\n\tconst extensions = argv.ext.split(\",\").map((cur: string) => {\n\t\treturn cur.startsWith(\".\") ? cur.slice(1) : cur;\n\t});\n\n\tconst files = await cli.expandFiles(argv._, { extensions });\n\tif (files.length === 0 && mode !== Mode.INIT) {\n\t\tconsole.error(\"No files matching patterns\", argv._);\n\t\tprocess.exit(1);\n\t}\n\n\ttry {\n\t\t/* istanbul ignore next -- not tested with unittests */\n\t\tif (!haveImportMetaResolve()) {\n\t\t\tthrow new ImportResolveMissingError();\n\t\t}\n\n\t\tlet success: boolean;\n\t\tswitch (mode) {\n\t\t\tcase Mode.LINT: {\n\t\t\t\tsuccess = await lint(htmlvalidate, process.stdout, files, {\n\t\t\t\t\tformatter,\n\t\t\t\t\tmaxWarnings,\n\t\t\t\t\tstdinFilename: argv[\"stdin-filename\"] ?? false,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase Mode.INIT: {\n\t\t\t\tsuccess = await init(cli, process.stdout, { cwd: process.cwd() });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase Mode.PRINT_CONFIG: {\n\t\t\t\tsuccess = await printConfig(htmlvalidate, process.stdout, files);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tsuccess = await dump(htmlvalidate, process.stdout, files, mode);\n\t\t\t}\n\t\t}\n\t\tprocess.exit(success ? 0 : 1);\n\t} catch (err) {\n\t\tif (err instanceof SchemaValidationError) {\n\t\t\thandleSchemaValidationError(console, err);\n\t\t} else if (isUserError(err)) {\n\t\t\thandleUserError(err);\n\t\t} else {\n\t\t\thandleUnknownError(err);\n\t\t}\n\t\tprocess.exit(1);\n\t}\n}\n\n/* eslint-disable-next-line unicorn/prefer-top-level-await -- technical debt, as long as we bundle and ship commonjs we cannot use TLA here */\nrun().catch((err: unknown) => {\n\tconsole.error(err);\n\tprocess.exit(1);\n});\n"],"names":["argv","Mode","kleur","pkgBugs","name","version","minimist","modeToFlag","path","fs","cli","CLI","haveImportMetaResolve","ImportResolveMissingError","lint","init","printConfig","dump","SchemaValidationError","handleSchemaValidationError","isUserError"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,SAAS,QAAQA,KAAAA,EAAqC;AACrD,EAAA,IAAIA,KAAAA,CAAK,MAAM,CAAA,EAAG;AACjB,IAAA,OAAOC,QAAA,CAAK,IAAA;AAAA,EACb;AAEA,EAAA,IAAID,KAAAA,CAAK,aAAa,CAAA,EAAG;AACxB,IAAA,OAAOC,QAAA,CAAK,WAAA;AAAA,EACb;AAEA,EAAA,IAAID,KAAAA,CAAK,aAAa,CAAA,EAAG;AACxB,IAAA,OAAOC,QAAA,CAAK,WAAA;AAAA,EACb;AAEA,EAAA,IAAID,KAAAA,CAAK,aAAa,CAAA,EAAG;AACxB,IAAA,OAAOC,QAAA,CAAK,WAAA;AAAA,EACb;AAEA,EAAA,IAAID,KAAAA,CAAK,WAAW,CAAA,EAAG;AACtB,IAAA,OAAOC,QAAA,CAAK,SAAA;AAAA,EACb;AAEA,EAAA,IAAID,KAAAA,CAAK,cAAc,CAAA,EAAG;AACzB,IAAA,OAAOC,QAAA,CAAK,YAAA;AAAA,EACb;AAEA,EAAA,OAAOA,QAAA,CAAK,IAAA;AACb;AAEA,SAAS,iBAAiB,IAAA,EAAqB;AAC9C,EAAA,QAAQ,IAAA;AAAM,IACb,KAAKA,QAAA,CAAK,IAAA;AACT,MAAA,OAAO,IAAA;AAAA,IACR,KAAKA,QAAA,CAAK,IAAA;AACT,MAAA,OAAO,KAAA;AAAA,IACR,KAAKA,QAAA,CAAK,WAAA;AAAA,IACV,KAAKA,QAAA,CAAK,WAAA;AAAA,IACV,KAAKA,QAAA,CAAK,SAAA;AAAA,IACV,KAAKA,QAAA,CAAK,WAAA;AAAA,IACV,KAAKA,QAAA,CAAK,YAAA;AACT,MAAA,OAAO,IAAA;AAAA;AAEV;AAEA,SAAS,gBAAgB,GAAA,EAA0B;AAClD,EAAA,MAAM,SAAA,GAAY,IAAI,YAAA,EAAa;AACnC,EAAA,IAAI,SAAA,EAAW;AACd,IAAA,OAAA,CAAQ,KAAA,EAAM;AACd,IAAA,OAAA,CAAQ,MAAM,SAAS,CAAA;AACvB,IAAA;AAAA,EACD;AAEA,EAAA,OAAA,CAAQ,KAAA,CAAMC,sBAAA,CAAM,GAAA,CAAI,mBAAmB,CAAC,CAAA;AAC5C,EAAA,OAAA,CAAQ,KAAA,EAAM;AACd,EAAA;AACC,IAAA,OAAA,CAAQ,KAAA,CAAM,GAAA,CAAI,YAAA,EAAa,IAAK,GAAG,CAAA;AAAA,EACxC;AACA,EAAA,OAAA,CAAQ,QAAA,EAAS;AAClB;AAEA,SAAS,mBAAmB,GAAA,EAAoB;AAC/C,EAAA,OAAA,CAAQ,KAAA,CAAMA,sBAAA,CAAM,GAAA,CAAI,mBAAmB,CAAC,CAAA;AAC5C,EAAA,OAAA,CAAQ,KAAA,EAAM;AACd,EAAA;AACC,IAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,EAClB;AACA,EAAA,OAAA,CAAQ,QAAA,EAAS;AACjB,EAAA,MAAM,MAAA,GAAS,GAAGC,SAAO,CAAA,sBAAA,CAAA;AACzB,EAAA,OAAA,CAAQ,KAAA,CAAMD,uBAAM,GAAA,CAAI,CAAA,iBAAA,EAAoBE,SAAI,CAAA,CAAA,EAAIC,YAAO,GAAG,CAAC,CAAA;AAC/D,EAAA,OAAA,CAAQ,KAAA;AAAA,IACPH,sBAAA,CAAM,GAAA;AAAA,MACL;AAAA,QACC,wBAAwB,MAAM,CAAA,CAAA;AAAA,QAC9B,CAAA,mEAAA,CAAA;AAAA,QACA,CAAA,0CAAA;AAAA,OACD,CAAE,KAAK,IAAI;AAAA;AACZ,GACD;AACD;AAEA,MAAM,OAAOI,yBAAA,CAAqB,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,EAAG;AAAA,EACxD,MAAA,EAAQ;AAAA,IACP,GAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA;AAAA,IACA,GAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,GAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA,OAAA,EAAS;AAAA,IACR,MAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD;AAAA,EACA,KAAA,EAAO;AAAA,IACN,CAAA,EAAG,QAAA;AAAA,IACH,CAAA,EAAG,WAAA;AAAA,IACH,CAAA,EAAG,QAAA;AAAA,IACH,CAAA,EAAG;AAAA,GACJ;AAAA,EACA,OAAA,EAAS;AAAA,IACR,GAAA,EAAK,MAAA;AAAA,IACL,SAAA,EAAW;AAAA,GACZ;AAAA,EACA,OAAA,EAAS,CAAC,GAAA,KAAgB;AACzB,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,eAAA,EAAkB,GAAG;AAAA,CAAI,CAAA;AAC9C,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IACf;AACA,IAAA,OAAO,IAAA;AAAA,EACR;AACD,CAAC,CAAA;AAED,SAAS,SAAA,GAAkB;AAC1B,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAGF,SAAI,IAAIC,YAAO;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA,CAmCvC,CAAA;AACD;AAEA,SAAS,WAAA,GAAoB;AAC5B,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAGD,SAAI,IAAIC,YAAO;AAAA,CAAI,CAAA;AAC5C;AAEA,IAAI,KAAK,KAAA,EAAO;AACf,EAAA,IAAA,CAAK,CAAA,CAAE,KAAK,GAAG,CAAA;AAChB;AAEA,IAAI,KAAK,OAAA,EAAS;AACjB,EAAA,WAAA,EAAY;AACZ,EAAA,OAAA,CAAQ,IAAA,EAAK;AACd;AAEA,IAAI,KAAK,IAAA,EAAM;AACd,EAAA,SAAA,EAAU;AACV,EAAA,OAAA,CAAQ,IAAA,EAAK;AACd;AAEA,IAAI,IAAA,CAAK,CAAA,CAAE,MAAA,KAAW,CAAA,EAAG;AACxB,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AACzB,EAAA,IAAI,IAAA,KAASJ,SAAK,IAAA,EAAM;AACvB,IAAA,SAAA,EAAU;AACV,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf,CAAA,MAAA,IAAW,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAClC,IAAA,MAAM,IAAA,GAAOM,eAAW,IAAI,CAAA;AAC5B,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAA,EAAK,IAAI,CAAA,uBAAA,CAAyB,CAAA;AAChD,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;AAGA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC9B,EAAA,MAAM,SAAA,GAAYC,qBAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAC1C,EAAA,IAAI,CAACC,mBAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,CAAA,gBAAA,CAAkB,CAAA;AACxD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,gDAAA,EAAmD,SAAS,CAAA,CAAA,CAAG,CAAA;AAC7E,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;AAGA,eAAe,GAAA,GAAqB;AACnC,EAAA,MAAMC,KAAA,GAAM,IAAIC,OAAA,CAAI;AAAA,IACnB,YAAY,IAAA,CAAK,MAAA;AAAA,IACjB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAO,IAAA,CAAK;AAAA,GACZ,CAAA;AACD,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AACzB,EAAA,MAAM,SAAA,GAAY,MAAMD,KAAA,CAAI,YAAA,CAAa,KAAK,SAAS,CAAA;AACvD,EAAA,MAAM,cAAc,MAAA,CAAO,QAAA,CAAS,KAAK,cAAc,CAAA,IAAK,MAAM,EAAE,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,MAAMA,KAAA,CAAI,YAAA,EAAa;AAG5C,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,MAAM,CAAA,eAAA,EAAkB,MAAA,CAAO,KAAK,cAAc,CAAC,CAAC,CAAA,yBAAA,CAA2B,CAAA;AACvF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AAGA,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,KAAgB;AAC3D,IAAA,OAAO,IAAI,UAAA,CAAW,GAAG,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAAA,EAC7C,CAAC,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,MAAMA,KAAA,CAAI,WAAA,CAAY,KAAK,CAAA,EAAG,EAAE,YAAY,CAAA;AAC1D,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,IAAA,KAAST,SAAK,IAAA,EAAM;AAC7C,IAAA,OAAA,CAAQ,KAAA,CAAM,4BAAA,EAA8B,IAAA,CAAK,CAAC,CAAA;AAClD,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AAEA,EAAA,IAAI;AAEH,IAAA,IAAI,CAACW,2BAAsB,EAAG;AAC7B,MAAA,MAAM,IAAIC,6BAAA,EAA0B;AAAA,IACrC;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,QAAQ,IAAA;AAAM,MACb,KAAKZ,SAAK,IAAA,EAAM;AACf,QAAA,OAAA,GAAU,MAAMa,QAAA,CAAK,YAAA,EAAc,OAAA,CAAQ,QAAQ,KAAA,EAAO;AAAA,UACzD,SAAA;AAAA,UACA,WAAA;AAAA,UACA,aAAA,EAAe,IAAA,CAAK,gBAAgB,CAAA,IAAK;AAAA,SACzC,CAAA;AACD,QAAA;AAAA,MACD;AAAA,MACA,KAAKb,SAAK,IAAA,EAAM;AACf,QAAA,OAAA,GAAU,MAAMc,QAAA,CAAKL,KAAA,EAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,CAAA;AAChE,QAAA;AAAA,MACD;AAAA,MACA,KAAKT,SAAK,YAAA,EAAc;AACvB,QAAA,OAAA,GAAU,MAAMe,eAAA,CAAY,YAAA,EAAc,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAC/D,QAAA;AAAA,MACD;AAAA,MACA,SAAS;AACR,QAAA,OAAA,GAAU,MAAMC,QAAA,CAAK,YAAA,EAAc,OAAA,CAAQ,MAAA,EAAQ,OAAO,IAAI,CAAA;AAAA,MAC/D;AAAA;AAED,IAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA;AAAA,EAC7B,SAAS,GAAA,EAAK;AACb,IAAA,IAAI,eAAeC,0BAAA,EAAuB;AACzC,MAAAC,+BAAA,CAA4B,SAAS,GAAG,CAAA;AAAA,IACzC,CAAA,MAAA,IAAWC,gBAAA,CAAY,GAAG,CAAA,EAAG;AAC5B,MAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,IACpB,CAAA,MAAO;AACN,MAAA,kBAAA,CAAmB,GAAG,CAAA;AAAA,IACvB;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACf;AACD;AAGA,GAAA,EAAI,CAAE,KAAA,CAAM,CAAC,GAAA,KAAiB;AAC7B,EAAA,OAAA,CAAQ,MAAM,GAAG,CAAA;AACjB,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACf,CAAC,CAAA;;"}
package/dist/cjs/html5.js CHANGED
@@ -3,6 +3,7 @@
3
3
  var elements = require('./elements.js');
4
4
  require('./meta-helper.js');
5
5
  require('./utils/natural-join.js');
6
+ require('./utils/parse-image-candidate-string.js');
6
7
 
7
8
  var html5 = elements.bundledElements.html5;
8
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"html5.js","sources":["../../src/html5.ts"],"sourcesContent":["import { bundledElements } from \"./elements\";\n\nexport default bundledElements.html5;\n"],"names":["bundledElements"],"mappings":";;;;;;AAEA,YAAeA,wBAAA,CAAgB,KAAA;;;;"}
1
+ {"version":3,"file":"html5.js","sources":["../../src/html5.ts"],"sourcesContent":["import { bundledElements } from \"./elements\";\n\nexport default bundledElements.html5;\n"],"names":["bundledElements"],"mappings":";;;;;;;AAEA,YAAeA,wBAAA,CAAgB,KAAA;;;;"}
package/dist/cjs/index.js CHANGED
@@ -11,6 +11,7 @@ require('node:url');
11
11
  require('kleur');
12
12
  require('ajv');
13
13
  require('./elements.js');
14
+ require('./utils/parse-image-candidate-string.js');
14
15
  require('@sidvind/better-ajv-errors');
15
16
  require('./utils/natural-join.js');
16
17
  require('@html-validate/stylish');
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -8,6 +8,7 @@ require('ajv');
8
8
  require('./elements.js');
9
9
  require('./meta-helper.js');
10
10
  require('./utils/natural-join.js');
11
+ require('./utils/parse-image-candidate-string.js');
11
12
  require('@sidvind/better-ajv-errors');
12
13
  require('kleur');
13
14
  require('@html-validate/stylish');
@@ -1 +1 @@
1
- {"version":3,"file":"jest-worker.js","sources":["../../src/jest/worker/worker.ts"],"sourcesContent":["import { type MessagePort, parentPort, workerData } from \"node:worker_threads\";\nimport { type ConfigData } from \"../../config\";\nimport { FileSystemConfigLoader } from \"../../config/loaders/file-system\";\nimport { HtmlValidate } from \"../../htmlvalidate\";\nimport { type Report } from \"../../reporter\";\nimport {\n\ttype AnyAsyncFn,\n\ttype MainToWorkerCommandMessage,\n\ttype MainToWorkerMessage,\n\ttype WorkerToMainMessage,\n} from \"./types\";\n\ninterface WorkerData {\n\tsharedBuffer: SharedArrayBuffer;\n\tworkerPort: MessagePort;\n}\n\n/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- false positive, it is used in nested functions */\nfunction runAsWorker<R = unknown, T extends AnyAsyncFn<R> = AnyAsyncFn<R>>(fn: T): void {\n\tif (!workerData) {\n\t\treturn;\n\t}\n\n\tconst { workerPort, sharedBuffer } = workerData as WorkerData;\n\tconst sharedBufferView = new Int32Array(sharedBuffer, 0, 1);\n\n\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- better crash at runtime if not set */\n\tparentPort!.on(\"message\", ({ id, args }: MainToWorkerMessage<Parameters<T>>) => {\n\t\tasync function inner(): Promise<void> {\n\t\t\tlet isAborted = false;\n\t\t\tconst handleAbortMessage = (msg: MainToWorkerCommandMessage): void => {\n\t\t\t\tif (msg.id === id && msg.cmd === \"abort\") {\n\t\t\t\t\tisAborted = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\tworkerPort.on(\"message\", handleAbortMessage);\n\t\t\tlet msg: WorkerToMainMessage<R>;\n\t\t\ttry {\n\t\t\t\tmsg = { id, result: await fn(...args) };\n\t\t\t} catch (error: unknown) {\n\t\t\t\tmsg = {\n\t\t\t\t\tid,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t};\n\t\t\t}\n\t\t\tworkerPort.off(\"message\", handleAbortMessage);\n\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- it may have been set by `handleAbortMessage` */\n\t\t\tif (isAborted) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tworkerPort.postMessage(msg);\n\t\t\tAtomics.add(sharedBufferView, 0, 1);\n\t\t\tAtomics.notify(sharedBufferView, 0);\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises -- should not happen\n\t\tinner();\n\t});\n}\n\nfunction validateString(markup: string, filename: string, config: ConfigData): Promise<Report> {\n\tconst loader = new FileSystemConfigLoader({\n\t\textends: [\"html-validate:recommended\"],\n\t});\n\tconst htmlvalidate = new HtmlValidate(loader);\n\treturn htmlvalidate.validateString(markup, filename, config);\n}\n\nexport type ValidateStringFn = typeof validateString;\n\nrunAsWorker(validateString);\n"],"names":["workerData","parentPort","msg","FileSystemConfigLoader","HtmlValidate"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,SAAS,YAAkE,EAAA,EAAa;AACvF,EAAA,IAAI,CAACA,8BAAA,EAAY;AAChB,IAAA;AAAA,EACD;AAEA,EAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAa,GAAIA,8BAAA;AACrC,EAAA,MAAM,gBAAA,GAAmB,IAAI,UAAA,CAAW,YAAA,EAAc,GAAG,CAAC,CAAA;AAG1D,EAAAC,8BAAA,CAAY,GAAG,SAAA,EAAW,CAAC,EAAE,EAAA,EAAI,MAAK,KAA0C;AAC/E,IAAA,eAAe,KAAA,GAAuB;AACrC,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,MAAM,kBAAA,GAAqB,CAACC,IAAAA,KAA0C;AACrE,QAAA,IAAIA,IAAAA,CAAI,EAAA,KAAO,EAAA,IAAMA,IAAAA,CAAI,QAAQ,OAAA,EAAS;AACzC,UAAA,SAAA,GAAY,IAAA;AAAA,QACb;AAAA,MACD,CAAA;AACA,MAAA,UAAA,CAAW,EAAA,CAAG,WAAW,kBAAkB,CAAA;AAC3C,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI;AACH,QAAA,GAAA,GAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA,EAAE;AAAA,MACvC,SAAS,KAAA,EAAgB;AACxB,QAAA,GAAA,GAAM;AAAA,UACL,EAAA;AAAA,UACA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D;AAAA,MACD;AACA,MAAA,UAAA,CAAW,GAAA,CAAI,WAAW,kBAAkB,CAAA;AAG5C,MAAA,IAAI,SAAA,EAAW;AACd,QAAA;AAAA,MACD;AACA,MAAA,UAAA,CAAW,YAAY,GAAG,CAAA;AAC1B,MAAA,OAAA,CAAQ,GAAA,CAAI,gBAAA,EAAkB,CAAA,EAAG,CAAC,CAAA;AAClC,MAAA,OAAA,CAAQ,MAAA,CAAO,kBAAkB,CAAC,CAAA;AAAA,IACnC;AAEA,IAAA,KAAA,EAAM;AAAA,EACP,CAAC,CAAA;AACF;AAEA,SAAS,cAAA,CAAe,MAAA,EAAgB,QAAA,EAAkB,MAAA,EAAqC;AAC9F,EAAA,MAAM,MAAA,GAAS,IAAIC,iCAAA,CAAuB;AAAA,IACzC,OAAA,EAAS,CAAC,2BAA2B;AAAA,GACrC,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,IAAIC,uBAAA,CAAa,MAAM,CAAA;AAC5C,EAAA,OAAO,YAAA,CAAa,cAAA,CAAe,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAC5D;AAIA,WAAA,CAAY,cAAc,CAAA;;"}
1
+ {"version":3,"file":"jest-worker.js","sources":["../../src/jest/worker/worker.ts"],"sourcesContent":["import { type MessagePort, parentPort, workerData } from \"node:worker_threads\";\nimport { type ConfigData } from \"../../config\";\nimport { FileSystemConfigLoader } from \"../../config/loaders/file-system\";\nimport { HtmlValidate } from \"../../htmlvalidate\";\nimport { type Report } from \"../../reporter\";\nimport {\n\ttype AnyAsyncFn,\n\ttype MainToWorkerCommandMessage,\n\ttype MainToWorkerMessage,\n\ttype WorkerToMainMessage,\n} from \"./types\";\n\ninterface WorkerData {\n\tsharedBuffer: SharedArrayBuffer;\n\tworkerPort: MessagePort;\n}\n\n/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- false positive, it is used in nested functions */\nfunction runAsWorker<R = unknown, T extends AnyAsyncFn<R> = AnyAsyncFn<R>>(fn: T): void {\n\tif (!workerData) {\n\t\treturn;\n\t}\n\n\tconst { workerPort, sharedBuffer } = workerData as WorkerData;\n\tconst sharedBufferView = new Int32Array(sharedBuffer, 0, 1);\n\n\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- better crash at runtime if not set */\n\tparentPort!.on(\"message\", ({ id, args }: MainToWorkerMessage<Parameters<T>>) => {\n\t\tasync function inner(): Promise<void> {\n\t\t\tlet isAborted = false;\n\t\t\tconst handleAbortMessage = (msg: MainToWorkerCommandMessage): void => {\n\t\t\t\tif (msg.id === id && msg.cmd === \"abort\") {\n\t\t\t\t\tisAborted = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\tworkerPort.on(\"message\", handleAbortMessage);\n\t\t\tlet msg: WorkerToMainMessage<R>;\n\t\t\ttry {\n\t\t\t\tmsg = { id, result: await fn(...args) };\n\t\t\t} catch (error: unknown) {\n\t\t\t\tmsg = {\n\t\t\t\t\tid,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t};\n\t\t\t}\n\t\t\tworkerPort.off(\"message\", handleAbortMessage);\n\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- it may have been set by `handleAbortMessage` */\n\t\t\tif (isAborted) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tworkerPort.postMessage(msg);\n\t\t\tAtomics.add(sharedBufferView, 0, 1);\n\t\t\tAtomics.notify(sharedBufferView, 0);\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises -- should not happen\n\t\tinner();\n\t});\n}\n\nfunction validateString(markup: string, filename: string, config: ConfigData): Promise<Report> {\n\tconst loader = new FileSystemConfigLoader({\n\t\textends: [\"html-validate:recommended\"],\n\t});\n\tconst htmlvalidate = new HtmlValidate(loader);\n\treturn htmlvalidate.validateString(markup, filename, config);\n}\n\nexport type ValidateStringFn = typeof validateString;\n\nrunAsWorker(validateString);\n"],"names":["workerData","parentPort","msg","FileSystemConfigLoader","HtmlValidate"],"mappings":";;;;;;;;;;;;;;;;;;;AAkBA,SAAS,YAAkE,EAAA,EAAa;AACvF,EAAA,IAAI,CAACA,8BAAA,EAAY;AAChB,IAAA;AAAA,EACD;AAEA,EAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAa,GAAIA,8BAAA;AACrC,EAAA,MAAM,gBAAA,GAAmB,IAAI,UAAA,CAAW,YAAA,EAAc,GAAG,CAAC,CAAA;AAG1D,EAAAC,8BAAA,CAAY,GAAG,SAAA,EAAW,CAAC,EAAE,EAAA,EAAI,MAAK,KAA0C;AAC/E,IAAA,eAAe,KAAA,GAAuB;AACrC,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,MAAM,kBAAA,GAAqB,CAACC,IAAAA,KAA0C;AACrE,QAAA,IAAIA,IAAAA,CAAI,EAAA,KAAO,EAAA,IAAMA,IAAAA,CAAI,QAAQ,OAAA,EAAS;AACzC,UAAA,SAAA,GAAY,IAAA;AAAA,QACb;AAAA,MACD,CAAA;AACA,MAAA,UAAA,CAAW,EAAA,CAAG,WAAW,kBAAkB,CAAA;AAC3C,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI;AACH,QAAA,GAAA,GAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA,EAAE;AAAA,MACvC,SAAS,KAAA,EAAgB;AACxB,QAAA,GAAA,GAAM;AAAA,UACL,EAAA;AAAA,UACA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D;AAAA,MACD;AACA,MAAA,UAAA,CAAW,GAAA,CAAI,WAAW,kBAAkB,CAAA;AAG5C,MAAA,IAAI,SAAA,EAAW;AACd,QAAA;AAAA,MACD;AACA,MAAA,UAAA,CAAW,YAAY,GAAG,CAAA;AAC1B,MAAA,OAAA,CAAQ,GAAA,CAAI,gBAAA,EAAkB,CAAA,EAAG,CAAC,CAAA;AAClC,MAAA,OAAA,CAAQ,MAAA,CAAO,kBAAkB,CAAC,CAAA;AAAA,IACnC;AAEA,IAAA,KAAA,EAAM;AAAA,EACP,CAAC,CAAA;AACF;AAEA,SAAS,cAAA,CAAe,MAAA,EAAgB,QAAA,EAAkB,MAAA,EAAqC;AAC9F,EAAA,MAAM,MAAA,GAAS,IAAIC,iCAAA,CAAuB;AAAA,IACzC,OAAA,EAAS,CAAC,2BAA2B;AAAA,GACrC,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,IAAIC,uBAAA,CAAa,MAAM,CAAA;AAC5C,EAAA,OAAO,YAAA,CAAa,cAAA,CAAe,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAC5D;AAIA,WAAA,CAAY,cAAc,CAAA;;"}
package/dist/cjs/jest.js CHANGED
@@ -11,6 +11,7 @@ require('ajv');
11
11
  require('./elements.js');
12
12
  require('./meta-helper.js');
13
13
  require('./utils/natural-join.js');
14
+ require('./utils/parse-image-candidate-string.js');
14
15
  require('@sidvind/better-ajv-errors');
15
16
  require('kleur');
16
17
  require('@html-validate/stylish');
@@ -1 +1 @@
1
- {"version":3,"file":"jest.js","sources":["../../src/jest/jest.ts"],"sourcesContent":["import { expect } from \"@jest/globals\";\nimport \"./augmentation\";\n\nimport {\n\ttoBeInvalid,\n\ttoBeValid,\n\ttoHTMLValidate,\n\ttoHaveError,\n\ttoHaveErrors,\n\ttoMatchCodeframe,\n\ttoMatchInlineCodeframe,\n} from \"./matchers\";\nimport { diff } from \"./utils\";\n\nexpect.extend({\n\ttoBeValid: toBeValid(),\n\ttoBeInvalid: toBeInvalid(),\n\ttoHTMLValidate: toHTMLValidate(expect, diff),\n\ttoHaveError: toHaveError(expect, diff),\n\ttoHaveErrors: toHaveErrors(expect, diff),\n\ttoMatchCodeframe: toMatchCodeframe(),\n\ttoMatchInlineCodeframe: toMatchInlineCodeframe(),\n});\n"],"names":["expect","toBeValid","toBeInvalid","toHTMLValidate","diff","toHaveError","toHaveErrors","toMatchCodeframe","toMatchInlineCodeframe"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAcAA,cAAA,CAAO,MAAA,CAAO;AAAA,EACb,WAAWC,wBAAA,EAAU;AAAA,EACrB,aAAaC,wBAAA,EAAY;AAAA,EACzB,cAAA,EAAgBC,wBAAA,CAAeH,cAAA,EAAQI,aAAI,CAAA;AAAA,EAC3C,WAAA,EAAaC,wBAAA,CAAYL,cAAA,EAAQI,aAAI,CAAA;AAAA,EACrC,YAAA,EAAcE,sBAAA,CAAaN,cAAA,EAAQI,aAAI,CAAA;AAAA,EACvC,kBAAkBG,gCAAA,EAAiB;AAAA,EACnC,wBAAwBC,8BAAA;AACzB,CAAC,CAAA;;"}
1
+ {"version":3,"file":"jest.js","sources":["../../src/jest/jest.ts"],"sourcesContent":["import { expect } from \"@jest/globals\";\nimport \"./augmentation\";\n\nimport {\n\ttoBeInvalid,\n\ttoBeValid,\n\ttoHTMLValidate,\n\ttoHaveError,\n\ttoHaveErrors,\n\ttoMatchCodeframe,\n\ttoMatchInlineCodeframe,\n} from \"./matchers\";\nimport { diff } from \"./utils\";\n\nexpect.extend({\n\ttoBeValid: toBeValid(),\n\ttoBeInvalid: toBeInvalid(),\n\ttoHTMLValidate: toHTMLValidate(expect, diff),\n\ttoHaveError: toHaveError(expect, diff),\n\ttoHaveErrors: toHaveErrors(expect, diff),\n\ttoMatchCodeframe: toMatchCodeframe(),\n\ttoMatchInlineCodeframe: toMatchInlineCodeframe(),\n});\n"],"names":["expect","toBeValid","toBeInvalid","toHTMLValidate","diff","toHaveError","toHaveErrors","toMatchCodeframe","toMatchInlineCodeframe"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAcAA,cAAA,CAAO,MAAA,CAAO;AAAA,EACb,WAAWC,wBAAA,EAAU;AAAA,EACrB,aAAaC,wBAAA,EAAY;AAAA,EACzB,cAAA,EAAgBC,wBAAA,CAAeH,cAAA,EAAQI,aAAI,CAAA;AAAA,EAC3C,WAAA,EAAaC,wBAAA,CAAYL,cAAA,EAAQI,aAAI,CAAA;AAAA,EACrC,YAAA,EAAcE,sBAAA,CAAaN,cAAA,EAAQI,aAAI,CAAA;AAAA,EACvC,kBAAkBG,gCAAA,EAAiB;AAAA,EACnC,wBAAwBC,8BAAA;AACzB,CAAC,CAAA;;"}
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ function parseImageCandidateString(srcset) {
4
+ if (!srcset.trim()) {
5
+ return [];
6
+ }
7
+ return srcset.split(",").map((candidate) => {
8
+ const parts = candidate.trim().split(/\s+/);
9
+ const url = parts[0];
10
+ if (!url) {
11
+ return { url: "", descriptor: "none", raw: null };
12
+ }
13
+ if (parts.length < 2) {
14
+ return { url, descriptor: "none", raw: null };
15
+ }
16
+ const descriptor = parts.at(-1);
17
+ if (/^\d+w$/i.test(descriptor)) {
18
+ return {
19
+ url,
20
+ descriptor: "width",
21
+ value: Number.parseInt(descriptor.slice(0, -1), 10),
22
+ raw: descriptor
23
+ };
24
+ }
25
+ if (/^(?:\d*\.\d+|\d+(?:\.\d+)?)x$/i.test(descriptor)) {
26
+ return {
27
+ url,
28
+ descriptor: "density",
29
+ value: Number.parseFloat(descriptor.slice(0, -1)),
30
+ raw: descriptor
31
+ };
32
+ }
33
+ return { url, descriptor: "none", raw: descriptor };
34
+ });
35
+ }
36
+
37
+ exports.parseImageCandidateString = parseImageCandidateString;
38
+ //# sourceMappingURL=parse-image-candidate-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-image-candidate-string.js","sources":["../../../src/utils/parse-image-candidate-string.ts"],"sourcesContent":["/**\n * @internal\n */\nexport type ParsedImageCandidateDescriptor =\n\t| {\n\t\t\turl: string;\n\t\t\tdescriptor: \"width\";\n\t\t\tvalue: number;\n\t\t\traw: string;\n\t }\n\t| {\n\t\t\turl: string;\n\t\t\tdescriptor: \"density\";\n\t\t\tvalue: number;\n\t\t\traw: string;\n\t }\n\t| {\n\t\t\turl: string;\n\t\t\tdescriptor: \"none\";\n\t\t\traw: string | null;\n\t };\n\n/**\n * Parse descriptors from an image candidate string.\n *\n * @internal\n * @param srcset - Image candidate string to parse.\n * @returns Parsed descriptors from all candidates in the string.\n */\nexport function parseImageCandidateString(srcset: string): ParsedImageCandidateDescriptor[] {\n\tif (!srcset.trim()) {\n\t\treturn [];\n\t}\n\treturn srcset.split(\",\").map((candidate): ParsedImageCandidateDescriptor => {\n\t\tconst parts = candidate.trim().split(/\\s+/);\n\t\tconst url = parts[0];\n\t\tif (!url) {\n\t\t\treturn { url: \"\", descriptor: \"none\", raw: null };\n\t\t}\n\n\t\tif (parts.length < 2) {\n\t\t\treturn { url, descriptor: \"none\", raw: null };\n\t\t}\n\n\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- parts.length >= 2 so at(-1) is always defined */\n\t\tconst descriptor = parts.at(-1)!;\n\n\t\tif (/^\\d+w$/i.test(descriptor)) {\n\t\t\treturn {\n\t\t\t\turl,\n\t\t\t\tdescriptor: \"width\",\n\t\t\t\tvalue: Number.parseInt(descriptor.slice(0, -1), 10),\n\t\t\t\traw: descriptor,\n\t\t\t};\n\t\t}\n\n\t\tif (/^(?:\\d*\\.\\d+|\\d+(?:\\.\\d+)?)x$/i.test(descriptor)) {\n\t\t\treturn {\n\t\t\t\turl,\n\t\t\t\tdescriptor: \"density\",\n\t\t\t\tvalue: Number.parseFloat(descriptor.slice(0, -1)),\n\t\t\t\traw: descriptor,\n\t\t\t};\n\t\t}\n\n\t\treturn { url, descriptor: \"none\", raw: descriptor };\n\t});\n}\n"],"names":[],"mappings":";;AA6BO,SAAS,0BAA0B,MAAA,EAAkD;AAC3F,EAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAK,EAAG;AACnB,IAAA,OAAO,EAAC;AAAA,EACT;AACA,EAAA,OAAO,OAAO,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,SAAA,KAA8C;AAC3E,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,IAAI,CAAC,GAAA,EAAK;AACT,MAAA,OAAO,EAAE,GAAA,EAAK,EAAA,EAAI,UAAA,EAAY,MAAA,EAAQ,KAAK,IAAA,EAAK;AAAA,IACjD;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACrB,MAAA,OAAO,EAAE,GAAA,EAAK,UAAA,EAAY,MAAA,EAAQ,KAAK,IAAA,EAAK;AAAA,IAC7C;AAGA,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA;AAE9B,IAAA,IAAI,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA,EAAG;AAC/B,MAAA,OAAO;AAAA,QACN,GAAA;AAAA,QACA,UAAA,EAAY,OAAA;AAAA,QACZ,KAAA,EAAO,OAAO,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG,EAAE,GAAG,EAAE,CAAA;AAAA,QAClD,GAAA,EAAK;AAAA,OACN;AAAA,IACD;AAEA,IAAA,IAAI,gCAAA,CAAiC,IAAA,CAAK,UAAU,CAAA,EAAG;AACtD,MAAA,OAAO;AAAA,QACN,GAAA;AAAA,QACA,UAAA,EAAY,SAAA;AAAA,QACZ,OAAO,MAAA,CAAO,UAAA,CAAW,WAAW,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,QAChD,GAAA,EAAK;AAAA,OACN;AAAA,IACD;AAEA,IAAA,OAAO,EAAE,GAAA,EAAK,UAAA,EAAY,MAAA,EAAQ,KAAK,UAAA,EAAW;AAAA,EACnD,CAAC,CAAA;AACF;;;;"}
@@ -8,6 +8,7 @@ require('ajv');
8
8
  require('./elements.js');
9
9
  require('./meta-helper.js');
10
10
  require('./utils/natural-join.js');
11
+ require('./utils/parse-image-candidate-string.js');
11
12
  require('@sidvind/better-ajv-errors');
12
13
  require('kleur');
13
14
  require('@html-validate/stylish');
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.js","sources":["../../src/vitest/vitest.ts"],"sourcesContent":["import \"./augmentation\";\n\nimport { expect } from \"vitest\";\nimport {\n\ttoBeInvalid,\n\ttoBeValid,\n\ttoHTMLValidate,\n\ttoHaveError,\n\ttoHaveErrors,\n} from \"../jest/matchers\";\n\nexpect.extend({\n\ttoBeValid: toBeValid(),\n\ttoBeInvalid: toBeInvalid(),\n\ttoHTMLValidate: toHTMLValidate(expect, undefined),\n\ttoHaveError: toHaveError(expect, undefined),\n\ttoHaveErrors: toHaveErrors(expect, undefined),\n});\n"],"names":["expect","toBeValid","toBeInvalid","toHTMLValidate","toHaveError","toHaveErrors"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAWAA,aAAA,CAAO,MAAA,CAAO;AAAA,EACb,WAAWC,wBAAA,EAAU;AAAA,EACrB,aAAaC,wBAAA,EAAY;AAAA,EACzB,cAAA,EAAgBC,wBAAA,CAAeH,aAAA,EAAQ,MAAS,CAAA;AAAA,EAChD,WAAA,EAAaI,wBAAA,CAAYJ,aAAA,EAAQ,MAAS,CAAA;AAAA,EAC1C,YAAA,EAAcK,sBAAA,CAAaL,aAAA,EAAQ,MAAS;AAC7C,CAAC,CAAA;;"}
1
+ {"version":3,"file":"vitest.js","sources":["../../src/vitest/vitest.ts"],"sourcesContent":["import \"./augmentation\";\n\nimport { expect } from \"vitest\";\nimport {\n\ttoBeInvalid,\n\ttoBeValid,\n\ttoHTMLValidate,\n\ttoHaveError,\n\ttoHaveErrors,\n} from \"../jest/matchers\";\n\nexpect.extend({\n\ttoBeValid: toBeValid(),\n\ttoBeInvalid: toBeInvalid(),\n\ttoHTMLValidate: toHTMLValidate(expect, undefined),\n\ttoHaveError: toHaveError(expect, undefined),\n\ttoHaveErrors: toHaveErrors(expect, undefined),\n});\n"],"names":["expect","toBeValid","toBeInvalid","toHTMLValidate","toHaveError","toHaveErrors"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAWAA,aAAA,CAAO,MAAA,CAAO;AAAA,EACb,WAAWC,wBAAA,EAAU;AAAA,EACrB,aAAaC,wBAAA,EAAY;AAAA,EACzB,cAAA,EAAgBC,wBAAA,CAAeH,aAAA,EAAQ,MAAS,CAAA;AAAA,EAChD,WAAA,EAAaI,wBAAA,CAAYJ,aAAA,EAAQ,MAAS,CAAA;AAAA,EAC1C,YAAA,EAAcK,sBAAA,CAAaL,aAAA,EAAQ,MAAS;AAC7C,CAAC,CAAA;;"}
@@ -3,6 +3,7 @@ export { A as Attribute, f as Config, e as ConfigError, C as ConfigLoader, D as
3
3
  export { d as defineMetadata, m as metadataHelper } from './meta-helper.js';
4
4
  import 'ajv';
5
5
  import './elements.js';
6
+ import './utils/parse-image-candidate-string.js';
6
7
  import '@sidvind/better-ajv-errors';
7
8
  import './utils/natural-join.js';
8
9
  import 'kleur';
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
1
+ {"version":3,"file":"browser.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
package/dist/esm/core.js CHANGED
@@ -588,6 +588,11 @@ const patternProperties = {
588
588
  type: "string"
589
589
  }
590
590
  },
591
+ optionalEnd: {
592
+ title: "Mark element as having an optional end tag",
593
+ description: "Elements whose end tag may be omitted per the HTML spec. Such an element is treated as implicitly closed at end-of-document and when a parent’s explicit end tag is encountered while it is still open.",
594
+ type: "boolean"
595
+ },
591
596
  implicitRole: {
592
597
  title: "Implicit ARIA role for this element",
593
598
  description: "Some elements have implicit ARIA roles.",
@@ -2583,6 +2588,7 @@ class HtmlElement extends DOMNode {
2583
2588
  * - foreign
2584
2589
  * - void
2585
2590
  * - implicitClosed
2591
+ * - optionalEnd
2586
2592
  * - scriptSupporting
2587
2593
  * - deprecatedAttributes
2588
2594
  *
@@ -12470,7 +12476,7 @@ class EventHandler {
12470
12476
  }
12471
12477
 
12472
12478
  const name = "html-validate";
12473
- const version = "10.12.1";
12479
+ const version = "10.13.0";
12474
12480
  const bugs = "https://gitlab.com/html-validate/html-validate/issues/new";
12475
12481
 
12476
12482
  function freeze(src) {
@@ -12747,19 +12753,20 @@ class Parser {
12747
12753
  */
12748
12754
  closeOptional(token) {
12749
12755
  const active = this.dom.getActive();
12750
- if (!active.meta?.implicitClosed) {
12756
+ if (!active.meta) {
12751
12757
  return false;
12752
12758
  }
12753
12759
  const tagName = token.data[2];
12754
12760
  const open = !token.data[1];
12755
- const meta = active.meta.implicitClosed;
12761
+ const implicitClosed = active.meta.implicitClosed;
12756
12762
  if (open) {
12757
- return meta.includes(tagName);
12763
+ return Boolean(implicitClosed?.includes(tagName));
12758
12764
  } else {
12759
12765
  if (active.is(tagName)) {
12760
12766
  return false;
12761
12767
  }
12762
- return Boolean(active.parent && active.parent.is(tagName) && meta.includes(active.tagName));
12768
+ const canOmitEnd = Boolean(implicitClosed?.includes(active.tagName)) || Boolean(active.meta.optionalEnd);
12769
+ return Boolean(active.parent && active.parent.is(tagName) && canOmitEnd);
12763
12770
  }
12764
12771
  }
12765
12772
  /**
@@ -13235,7 +13242,7 @@ class Parser {
13235
13242
  const documentElement = this.dom.root;
13236
13243
  let active = this.dom.getActive();
13237
13244
  while (!active.isRootElement()) {
13238
- if (active.meta?.implicitClosed) {
13245
+ if (active.meta?.implicitClosed || active.meta?.optionalEnd) {
13239
13246
  active.closed = NodeClosed.ImplicitClosed;
13240
13247
  this.closeElement(source, documentElement, active, location);
13241
13248
  } else {