html-validate 8.21.0 → 8.23.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.
@@ -11,7 +11,6 @@ require('./elements.js');
11
11
  require('./meta-helper.js');
12
12
  require('./utils/natural-join.js');
13
13
  require('@sidvind/better-ajv-errors');
14
- require('@babel/code-frame');
15
14
  require('@html-validate/stylish');
16
15
  require('semver');
17
16
  require('./core-nodejs.js');
@@ -1 +1 @@
1
- {"version":3,"file":"html-validate.js","sources":["../../src/cli/html-validate.ts"],"sourcesContent":["/* eslint-disable no-console, n/no-process-exit, sonarjs/no-duplicate-string -- as expected from a cli app */\nimport fs from \"fs\";\nimport path from \"node:path\";\nimport kleur from \"kleur\";\nimport minimist from \"minimist\";\nimport { SchemaValidationError, UserError } from \"..\";\nimport { name, version, bugs as pkgBugs } from \"../generated/package\";\nimport { CLI } from \"./cli\";\nimport { handleSchemaValidationError } from \"./errors\";\nimport { Mode, modeToFlag } from \"./mode\";\nimport { lint } from \"./actions/lint\";\nimport { init } from \"./actions/init\";\nimport { printConfig } from \"./actions/print-config\";\nimport { dump } from \"./actions/dump\";\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\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, any>): 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: UserError): 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: [\"c\", \"config\", \"ext\", \"f\", \"formatter\", \"max-warnings\", \"rule\", \"stdin-filename\"],\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\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 --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 (typeof argv.config !== \"undefined\") {\n\tconst checkPath = path.resolve(argv.config);\n\tif (!fs.existsSync(checkPath)) {\n\t\tconsole.log(`The file \"${String(argv.config)}\" was not found.`);\n\t\tconsole.log(`The location this file was checked for at was: \"${String(checkPath)}\"`);\n\t\tprocess.exit(1);\n\t}\n}\n\nconst cli = new CLI({\n\tconfigFile: argv.config,\n\trules: argv.rule,\n});\nconst mode = getMode(argv);\nconst formatter = cli.getFormatter(argv.formatter);\nconst maxWarnings = parseInt(argv[\"max-warnings\"] ?? \"-1\", 10);\nconst htmlvalidate = cli.getValidator();\n\n/* sanity check: ensure maxWarnings has a valid value */\nif (isNaN(maxWarnings)) {\n\tconsole.log(`Invalid value \"${String(argv[\"max-warnings\"])}\" given to --max-warnings`);\n\tprocess.exit(1);\n}\n\n/* parse extensions (used when expanding directories) */\nconst extensions = argv.ext.split(\",\").map((cur: string) => {\n\treturn cur.startsWith(\".\") ? cur.slice(1) : cur;\n});\n\nconst files = cli.expandFiles(argv._, { extensions });\nif (files.length === 0 && mode !== Mode.INIT) {\n\tconsole.error(\"No files matching patterns\", argv._);\n\tprocess.exit(1);\n}\n\nasync function run(): Promise<void> {\n\ttry {\n\t\tlet success: boolean;\n\t\tif (mode === Mode.LINT) {\n\t\t\tsuccess = await lint(htmlvalidate, process.stdout, files, {\n\t\t\t\tformatter,\n\t\t\t\tmaxWarnings,\n\t\t\t\tstdinFilename: argv[\"stdin-filename\"] ?? false,\n\t\t\t});\n\t\t} else if (mode === Mode.INIT) {\n\t\t\tsuccess = await init(cli, process.stdout, { cwd: process.cwd() });\n\t\t} else if (mode === Mode.PRINT_CONFIG) {\n\t\t\tsuccess = await printConfig(htmlvalidate, process.stdout, files);\n\t\t} else {\n\t\t\tsuccess = await dump(htmlvalidate, process.stdout, files, mode);\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 (err instanceof UserError) {\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\nrun().catch((err: unknown) => {\n\tconsole.error(err);\n\tprocess.exit(1);\n});\n"],"names":["argv","Mode","mode","kleur","pkgBugs","name","version","minimist","modeToFlag","path","fs","CLI","lint","init","printConfig","dump","SchemaValidationError","handleSchemaValidationError","UserError"],"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, sonarjs/no-duplicate-string -- as expected from a cli app */\nimport fs from \"fs\";\nimport path from \"node:path\";\nimport kleur from \"kleur\";\nimport minimist from \"minimist\";\nimport { SchemaValidationError, UserError } from \"..\";\nimport { name, version, bugs as pkgBugs } from \"../generated/package\";\nimport { CLI } from \"./cli\";\nimport { handleSchemaValidationError } from \"./errors\";\nimport { Mode, modeToFlag } from \"./mode\";\nimport { lint } from \"./actions/lint\";\nimport { init } from \"./actions/init\";\nimport { printConfig } from \"./actions/print-config\";\nimport { dump } from \"./actions/dump\";\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\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, any>): 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: UserError): 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: [\"c\", \"config\", \"ext\", \"f\", \"formatter\", \"max-warnings\", \"rule\", \"stdin-filename\"],\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\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 --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 (typeof argv.config !== \"undefined\") {\n\tconst checkPath = path.resolve(argv.config);\n\tif (!fs.existsSync(checkPath)) {\n\t\tconsole.log(`The file \"${String(argv.config)}\" was not found.`);\n\t\tconsole.log(`The location this file was checked for at was: \"${String(checkPath)}\"`);\n\t\tprocess.exit(1);\n\t}\n}\n\nconst cli = new CLI({\n\tconfigFile: argv.config,\n\trules: argv.rule,\n});\nconst mode = getMode(argv);\nconst formatter = cli.getFormatter(argv.formatter);\nconst maxWarnings = parseInt(argv[\"max-warnings\"] ?? \"-1\", 10);\nconst htmlvalidate = cli.getValidator();\n\n/* sanity check: ensure maxWarnings has a valid value */\nif (isNaN(maxWarnings)) {\n\tconsole.log(`Invalid value \"${String(argv[\"max-warnings\"])}\" given to --max-warnings`);\n\tprocess.exit(1);\n}\n\n/* parse extensions (used when expanding directories) */\nconst extensions = argv.ext.split(\",\").map((cur: string) => {\n\treturn cur.startsWith(\".\") ? cur.slice(1) : cur;\n});\n\nconst files = cli.expandFiles(argv._, { extensions });\nif (files.length === 0 && mode !== Mode.INIT) {\n\tconsole.error(\"No files matching patterns\", argv._);\n\tprocess.exit(1);\n}\n\nasync function run(): Promise<void> {\n\ttry {\n\t\tlet success: boolean;\n\t\tif (mode === Mode.LINT) {\n\t\t\tsuccess = await lint(htmlvalidate, process.stdout, files, {\n\t\t\t\tformatter,\n\t\t\t\tmaxWarnings,\n\t\t\t\tstdinFilename: argv[\"stdin-filename\"] ?? false,\n\t\t\t});\n\t\t} else if (mode === Mode.INIT) {\n\t\t\tsuccess = await init(cli, process.stdout, { cwd: process.cwd() });\n\t\t} else if (mode === Mode.PRINT_CONFIG) {\n\t\t\tsuccess = await printConfig(htmlvalidate, process.stdout, files);\n\t\t} else {\n\t\t\tsuccess = await dump(htmlvalidate, process.stdout, files, mode);\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 (err instanceof UserError) {\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\nrun().catch((err: unknown) => {\n\tconsole.error(err);\n\tprocess.exit(1);\n});\n"],"names":["argv","Mode","mode","kleur","pkgBugs","name","version","minimist","modeToFlag","path","fs","CLI","lint","init","printConfig","dump","SchemaValidationError","handleSchemaValidationError","UserError"],"mappings":"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"}
package/dist/cjs/index.js CHANGED
@@ -12,7 +12,6 @@ require('./elements.js');
12
12
  require('@sidvind/better-ajv-errors');
13
13
  require('./utils/natural-join.js');
14
14
  require('fs');
15
- require('@babel/code-frame');
16
15
  require('@html-validate/stylish');
17
16
  require('semver');
18
17
  require('glob');
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/cjs/jest.js CHANGED
@@ -11,7 +11,6 @@ require('./meta-helper.js');
11
11
  require('./utils/natural-join.js');
12
12
  require('@sidvind/better-ajv-errors');
13
13
  require('fs');
14
- require('@babel/code-frame');
15
14
  require('kleur');
16
15
  require('@html-validate/stylish');
17
16
  require('semver');
@@ -1 +1 @@
1
- {"version":3,"file":"jest.js","sources":["../../src/jest/jest.ts"],"sourcesContent":["import \"./augmentation\";\n\nimport {\n\ttoBeValid,\n\ttoBeInvalid,\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":["toBeValid","toBeInvalid","toHTMLValidate","diff","toHaveError","toHaveErrors","toMatchCodeframe","toMatchInlineCodeframe"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAaA,MAAA,CAAO,MAAO,CAAA;AAAA,EACb,WAAWA,sBAAU,EAAA;AAAA,EACrB,aAAaC,wBAAY,EAAA;AAAA,EACzB,cAAA,EAAgBC,wBAAe,CAAA,MAAA,EAAQC,aAAI,CAAA;AAAA,EAC3C,WAAA,EAAaC,wBAAY,CAAA,MAAA,EAAQD,aAAI,CAAA;AAAA,EACrC,YAAA,EAAcE,wBAAa,CAAA,MAAA,EAAQF,aAAI,CAAA;AAAA,EACvC,kBAAkBG,8BAAiB,EAAA;AAAA,EACnC,wBAAwBC,gCAAuB,EAAA;AAChD,CAAC,CAAA;;"}
1
+ {"version":3,"file":"jest.js","sources":["../../src/jest/jest.ts"],"sourcesContent":["import \"./augmentation\";\n\nimport {\n\ttoBeValid,\n\ttoBeInvalid,\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":["toBeValid","toBeInvalid","toHTMLValidate","diff","toHaveError","toHaveErrors","toMatchCodeframe","toMatchInlineCodeframe"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAaA,MAAA,CAAO,MAAO,CAAA;AAAA,EACb,WAAWA,sBAAU,EAAA;AAAA,EACrB,aAAaC,wBAAY,EAAA;AAAA,EACzB,cAAA,EAAgBC,wBAAe,CAAA,MAAA,EAAQC,aAAI,CAAA;AAAA,EAC3C,WAAA,EAAaC,wBAAY,CAAA,MAAA,EAAQD,aAAI,CAAA;AAAA,EACrC,YAAA,EAAcE,wBAAa,CAAA,MAAA,EAAQF,aAAI,CAAA;AAAA,EACvC,kBAAkBG,8BAAiB,EAAA;AAAA,EACnC,wBAAwBC,gCAAuB,EAAA;AAChD,CAAC,CAAA;;"}
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.47.2"
8
+ "packageVersion": "7.47.9"
9
9
  }
10
10
  ]
11
11
  }
@@ -10,7 +10,6 @@ require('./meta-helper.js');
10
10
  require('./utils/natural-join.js');
11
11
  require('@sidvind/better-ajv-errors');
12
12
  require('fs');
13
- require('@babel/code-frame');
14
13
  require('kleur');
15
14
  require('@html-validate/stylish');
16
15
  require('semver');
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.js","sources":["../../src/vitest/vitest.ts"],"sourcesContent":["import \"./augmentation\";\n\nimport { expect } from \"vitest\";\nimport {\n\ttoBeValid,\n\ttoBeInvalid,\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,MAAO,CAAA;AAAA,EACb,WAAWC,sBAAU,EAAA;AAAA,EACrB,aAAaC,wBAAY,EAAA;AAAA,EACzB,cAAA,EAAgBC,wBAAe,CAAAH,aAAA,EAAQ,KAAS,CAAA,CAAA;AAAA,EAChD,WAAA,EAAaI,wBAAY,CAAAJ,aAAA,EAAQ,KAAS,CAAA,CAAA;AAAA,EAC1C,YAAA,EAAcK,wBAAa,CAAAL,aAAA,EAAQ,KAAS,CAAA,CAAA;AAC7C,CAAC,CAAA;;"}
1
+ {"version":3,"file":"vitest.js","sources":["../../src/vitest/vitest.ts"],"sourcesContent":["import \"./augmentation\";\n\nimport { expect } from \"vitest\";\nimport {\n\ttoBeValid,\n\ttoBeInvalid,\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,MAAO,CAAA;AAAA,EACb,WAAWC,sBAAU,EAAA;AAAA,EACrB,aAAaC,wBAAY,EAAA;AAAA,EACzB,cAAA,EAAgBC,wBAAe,CAAAH,aAAA,EAAQ,KAAS,CAAA,CAAA;AAAA,EAChD,WAAA,EAAaI,wBAAY,CAAAJ,aAAA,EAAQ,KAAS,CAAA,CAAA;AAAA,EAC1C,YAAA,EAAcK,wBAAa,CAAAL,aAAA,EAAQ,KAAS,CAAA,CAAA;AAC7C,CAAC,CAAA;;"}
@@ -6,7 +6,6 @@ import './elements.js';
6
6
  import '@sidvind/better-ajv-errors';
7
7
  import './utils/natural-join.js';
8
8
  import 'fs';
9
- import '@babel/code-frame';
10
9
  import 'kleur';
11
10
  import '@html-validate/stylish';
12
11
  import 'semver';
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
1
+ {"version":3,"file":"browser.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
package/dist/es/core.js CHANGED
@@ -3,7 +3,6 @@ import { e as entities$1, h as html5, b as bundledElements } from './elements.js
3
3
  import betterAjvErrors from '@sidvind/better-ajv-errors';
4
4
  import { n as naturalJoin } from './utils/natural-join.js';
5
5
  import fs from 'fs';
6
- import { codeFrameColumns } from '@babel/code-frame';
7
6
  import kleur from 'kleur';
8
7
  import { stylish as stylish$1 } from '@html-validate/stylish';
9
8
  import semver from 'semver';
@@ -1671,6 +1670,7 @@ class DOMNode {
1671
1670
  /**
1672
1671
  * Create a new DOMNode.
1673
1672
  *
1673
+ * @internal
1674
1674
  * @param nodeType - What node type to create.
1675
1675
  * @param nodeName - What node name to use. For `HtmlElement` this corresponds
1676
1676
  * to the tagName but other node types have specific predefined values.
@@ -2339,8 +2339,15 @@ function createAdapter(node) {
2339
2339
  };
2340
2340
  }
2341
2341
  class HtmlElement extends DOMNode {
2342
- constructor(tagName, parent, closed, meta, location) {
2343
- const nodeType = tagName ? NodeType.ELEMENT_NODE : NodeType.DOCUMENT_NODE;
2342
+ constructor(details) {
2343
+ const {
2344
+ nodeType,
2345
+ tagName,
2346
+ parent = null,
2347
+ closed = 1 /* EndTag */,
2348
+ meta = null,
2349
+ location
2350
+ } = details;
2344
2351
  super(nodeType, tagName, location);
2345
2352
  if (isInvalidTagName(tagName)) {
2346
2353
  throw new Error(`The tag name provided ("${tagName}") is not a valid name`);
@@ -2363,11 +2370,39 @@ class HtmlElement extends DOMNode {
2363
2370
  }
2364
2371
  }
2365
2372
  }
2373
+ /**
2374
+ * Manually create a new element. This is primary useful for test-cases. While
2375
+ * the API is public it is not meant for general consumption and is not
2376
+ * guaranteed to be stable across versions.
2377
+ *
2378
+ * Use at your own risk. Prefer to use [[Parser]] to parse a string of markup
2379
+ * instead.
2380
+ *
2381
+ * @public
2382
+ * @since 8.22.0
2383
+ * @param tagName - Element tagname.
2384
+ * @param location - Element location.
2385
+ * @param details - Additional element details.
2386
+ */
2387
+ static createElement(tagName, location, details = {}) {
2388
+ const { closed = 1 /* EndTag */, meta = null, parent = null } = details;
2389
+ return new HtmlElement({
2390
+ nodeType: NodeType.ELEMENT_NODE,
2391
+ tagName,
2392
+ parent,
2393
+ closed,
2394
+ meta,
2395
+ location
2396
+ });
2397
+ }
2366
2398
  /**
2367
2399
  * @internal
2368
2400
  */
2369
2401
  static rootNode(location) {
2370
- const root = new HtmlElement(void 0, null, 1 /* EndTag */, null, location);
2402
+ const root = new HtmlElement({
2403
+ nodeType: NodeType.DOCUMENT_NODE,
2404
+ location
2405
+ });
2371
2406
  root.setAnnotation("#document");
2372
2407
  return root;
2373
2408
  }
@@ -2386,7 +2421,14 @@ class HtmlElement extends DOMNode {
2386
2421
  const open = startToken.data[1] !== "/";
2387
2422
  const closed = isClosed(endToken, meta);
2388
2423
  const location = sliceLocation(startToken.location, 1);
2389
- return new HtmlElement(tagName, open ? parent : null, closed, meta, location);
2424
+ return new HtmlElement({
2425
+ nodeType: NodeType.ELEMENT_NODE,
2426
+ tagName,
2427
+ parent: open ? parent : null,
2428
+ closed,
2429
+ meta,
2430
+ location
2431
+ });
2390
2432
  }
2391
2433
  /**
2392
2434
  * Returns annotated name if set or defaults to `<tagName>`.
@@ -2816,6 +2858,35 @@ function isClosed(endToken, meta) {
2816
2858
  return closed;
2817
2859
  }
2818
2860
 
2861
+ function dumpTree(root) {
2862
+ const lines = [];
2863
+ function decoration(node) {
2864
+ let output = "";
2865
+ if (node.id) {
2866
+ output += `#${node.id}`;
2867
+ }
2868
+ if (node.hasAttribute("class")) {
2869
+ output += `.${node.classList.join(".")}`;
2870
+ }
2871
+ return output;
2872
+ }
2873
+ function writeNode(node, level, sibling) {
2874
+ if (node.parent) {
2875
+ const indent = " ".repeat(level - 1);
2876
+ const l = node.childElements.length > 0 ? "\u252C" : "\u2500";
2877
+ const b = sibling < node.parent.childElements.length - 1 ? "\u251C" : "\u2514";
2878
+ lines.push(`${indent}${b}\u2500${l} ${node.tagName}${decoration(node)}`);
2879
+ } else {
2880
+ lines.push("(root)");
2881
+ }
2882
+ node.childElements.forEach((child, index) => {
2883
+ writeNode(child, level + 1, index);
2884
+ });
2885
+ }
2886
+ writeNode(root, 0, 0);
2887
+ return lines;
2888
+ }
2889
+
2819
2890
  function escape(value) {
2820
2891
  return JSON.stringify(value);
2821
2892
  }
@@ -11160,12 +11231,18 @@ class Config {
11160
11231
  }
11161
11232
 
11162
11233
  class ConfigLoader {
11163
- constructor(resolvers, config) {
11234
+ /**
11235
+ * Create a new ConfigLoader.
11236
+ *
11237
+ * @param resolvers - Sorted list of resolvers to use (in order).
11238
+ * @param configData - Default configuration (which all configurations will inherit from).
11239
+ */
11240
+ constructor(resolvers, configData) {
11164
11241
  const defaults = Config.empty();
11165
11242
  this.resolvers = resolvers;
11166
11243
  this.globalConfig = defaults.merge(
11167
11244
  this.resolvers,
11168
- config ? this.loadFromObject(config) : this.defaultConfig()
11245
+ configData ? this.loadFromObject(configData) : this.defaultConfig()
11169
11246
  );
11170
11247
  }
11171
11248
  /**
@@ -12086,33 +12163,8 @@ class Engine {
12086
12163
  }
12087
12164
  dumpTree(source) {
12088
12165
  const parser = this.instantiateParser();
12089
- const document = parser.parseHtml(source[0]);
12090
- const lines = [];
12091
- function decoration(node) {
12092
- let output = "";
12093
- if (node.id) {
12094
- output += `#${node.id}`;
12095
- }
12096
- if (node.hasAttribute("class")) {
12097
- output += `.${node.classList.join(".")}`;
12098
- }
12099
- return output;
12100
- }
12101
- function writeNode(node, level, sibling) {
12102
- if (node.parent) {
12103
- const indent = " ".repeat(level - 1);
12104
- const l = node.childElements.length > 0 ? "\u252C" : "\u2500";
12105
- const b = sibling < node.parent.childElements.length - 1 ? "\u251C" : "\u2514";
12106
- lines.push(`${indent}${b}\u2500${l} ${node.tagName}${decoration(node)}`);
12107
- } else {
12108
- lines.push("(root)");
12109
- }
12110
- node.childElements.forEach((child, index) => {
12111
- writeNode(child, level + 1, index);
12112
- });
12113
- }
12114
- writeNode(document, 0, 0);
12115
- return lines;
12166
+ const root = parser.parseHtml(source[0]);
12167
+ return dumpTree(root);
12116
12168
  }
12117
12169
  /**
12118
12170
  * Get rule documentation.
@@ -12787,7 +12839,7 @@ class HtmlValidate {
12787
12839
  }
12788
12840
 
12789
12841
  const name = "html-validate";
12790
- const version = "8.21.0";
12842
+ const version = "8.23.0";
12791
12843
  const bugs = "https://gitlab.com/html-validate/html-validate/issues/new";
12792
12844
 
12793
12845
  function definePlugin(plugin) {
@@ -12875,17 +12927,26 @@ const REPLACERS = [
12875
12927
  [
12876
12928
  // (a\ ) -> (a )
12877
12929
  // (a ) -> (a)
12930
+ // (a ) -> (a)
12878
12931
  // (a \ ) -> (a )
12879
- /\\?\s+$/,
12880
- match => match.indexOf('\\') === 0
12881
- ? SPACE
12882
- : EMPTY
12932
+ /((?:\\\\)*?)(\\?\s+)$/,
12933
+ (_, m1, m2) => m1 + (
12934
+ m2.indexOf('\\') === 0
12935
+ ? SPACE
12936
+ : EMPTY
12937
+ )
12883
12938
  ],
12884
12939
 
12885
12940
  // replace (\ ) with ' '
12941
+ // (\ ) -> ' '
12942
+ // (\\ ) -> '\\ '
12943
+ // (\\\ ) -> '\\ '
12886
12944
  [
12887
- /\\\s/g,
12888
- () => SPACE
12945
+ /(\\+?)\s/g,
12946
+ (_, m1) => {
12947
+ const {length} = m1;
12948
+ return m1.slice(0, length - length % 2) + SPACE
12949
+ }
12889
12950
  ],
12890
12951
 
12891
12952
  // Escape metacharacters
@@ -13113,7 +13174,8 @@ const makeRegex = (pattern, ignoreCase) => {
13113
13174
 
13114
13175
  if (!source) {
13115
13176
  source = REPLACERS.reduce(
13116
- (prev, current) => prev.replace(current[0], current[1].bind(pattern)),
13177
+ (prev, [matcher, replacer]) =>
13178
+ prev.replace(matcher, replacer.bind(pattern)),
13117
13179
  pattern
13118
13180
  );
13119
13181
  regexCache[pattern] = source;
@@ -13479,6 +13541,81 @@ const defaults = {
13479
13541
  showSummary: true,
13480
13542
  showSelector: false
13481
13543
  };
13544
+ const NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
13545
+ function getMarkerLines(loc, source) {
13546
+ const startLoc = {
13547
+ ...loc.start
13548
+ };
13549
+ const endLoc = {
13550
+ ...startLoc,
13551
+ ...loc.end
13552
+ };
13553
+ const linesAbove = 2;
13554
+ const linesBelow = 3;
13555
+ const startLine = startLoc.line;
13556
+ const startColumn = startLoc.column;
13557
+ const endLine = endLoc.line;
13558
+ const endColumn = endLoc.column;
13559
+ const start = Math.max(startLine - (linesAbove + 1), 0);
13560
+ const end = Math.min(source.length, endLine + linesBelow);
13561
+ const lineDiff = endLine - startLine;
13562
+ const markerLines = {};
13563
+ if (lineDiff) {
13564
+ for (let i = 0; i <= lineDiff; i++) {
13565
+ const lineNumber = i + startLine;
13566
+ if (!startColumn) {
13567
+ markerLines[lineNumber] = true;
13568
+ } else if (i === 0) {
13569
+ const sourceLength = source[lineNumber - 1].length;
13570
+ markerLines[lineNumber] = [startColumn, sourceLength - startColumn + 1];
13571
+ } else if (i === lineDiff) {
13572
+ markerLines[lineNumber] = [0, endColumn];
13573
+ } else {
13574
+ const sourceLength = source[lineNumber - i].length;
13575
+ markerLines[lineNumber] = [0, sourceLength];
13576
+ }
13577
+ }
13578
+ } else {
13579
+ if (startColumn === endColumn) {
13580
+ if (startColumn) {
13581
+ markerLines[startLine] = [startColumn, 0];
13582
+ } else {
13583
+ markerLines[startLine] = true;
13584
+ }
13585
+ } else {
13586
+ markerLines[startLine] = [startColumn, endColumn - startColumn];
13587
+ }
13588
+ }
13589
+ return { start, end, markerLines };
13590
+ }
13591
+ function codeFrameColumns(rawLines, loc) {
13592
+ const lines = rawLines.split(NEWLINE);
13593
+ const { start, end, markerLines } = getMarkerLines(loc, lines);
13594
+ const numberMaxWidth = String(end).length;
13595
+ return rawLines.split(NEWLINE, end).slice(start, end).map((line, index) => {
13596
+ const number = start + 1 + index;
13597
+ const paddedNumber = ` ${String(number)}`.slice(-numberMaxWidth);
13598
+ const gutter = ` ${paddedNumber} |`;
13599
+ const hasMarker = markerLines[number];
13600
+ if (hasMarker) {
13601
+ let markerLine = "";
13602
+ if (Array.isArray(hasMarker)) {
13603
+ const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " ");
13604
+ const numberOfMarkers = hasMarker[1] || 1;
13605
+ markerLine = [
13606
+ "\n ",
13607
+ gutter.replace(/\d/g, " "),
13608
+ " ",
13609
+ markerSpacing,
13610
+ "^".repeat(numberOfMarkers)
13611
+ ].join("");
13612
+ }
13613
+ return [">", gutter, line.length > 0 ? ` ${line}` : "", markerLine].join("");
13614
+ } else {
13615
+ return [" ", gutter, line.length > 0 ? ` ${line}` : ""].join("");
13616
+ }
13617
+ }).join("\n");
13618
+ }
13482
13619
  function pluralize(word, count) {
13483
13620
  return count === 1 ? word : `${word}s`;
13484
13621
  }
@@ -13521,16 +13658,11 @@ function formatMessage(message, parentResult, options) {
13521
13658
  ].filter(String).join(" ");
13522
13659
  const result = [firstLine];
13523
13660
  if (sourceCode) {
13524
- result.push(
13525
- codeFrameColumns(
13526
- sourceCode,
13527
- {
13528
- start: getStartLocation(message),
13529
- end: getEndLocation(message, sourceCode)
13530
- },
13531
- { highlightCode: false }
13532
- )
13533
- );
13661
+ const output = codeFrameColumns(sourceCode, {
13662
+ start: getStartLocation(message),
13663
+ end: getEndLocation(message, sourceCode)
13664
+ });
13665
+ result.push(output);
13534
13666
  }
13535
13667
  if (options.showSelector) {
13536
13668
  result.push(`${kleur.bold("Selector:")} ${message.selector ?? "-"}`);