html-validate 9.7.1 → 10.1.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 (79) hide show
  1. package/README.md +2 -2
  2. package/bin/html-validate.mjs +1 -1
  3. package/dist/cjs/cli.js +2 -2
  4. package/dist/cjs/cli.js.map +1 -1
  5. package/dist/cjs/core-browser.js.map +1 -1
  6. package/dist/cjs/core-nodejs.js.map +1 -1
  7. package/dist/cjs/core.js +40 -12
  8. package/dist/cjs/core.js.map +1 -1
  9. package/dist/cjs/elements.js.map +1 -1
  10. package/dist/cjs/html-validate.js +3 -3
  11. package/dist/cjs/html-validate.js.map +1 -1
  12. package/dist/cjs/jest-worker.js.map +1 -1
  13. package/dist/cjs/matcher-utils.js.map +1 -1
  14. package/dist/cjs/matchers-jestonly.js.map +1 -1
  15. package/dist/cjs/matchers.js.map +1 -1
  16. package/dist/cjs/meta-helper.js.map +1 -1
  17. package/dist/cjs/tsdoc-metadata.json +1 -1
  18. package/dist/{es → esm}/cli.js +2 -2
  19. package/dist/esm/cli.js.map +1 -0
  20. package/dist/{es → esm}/core-browser.js.map +1 -1
  21. package/dist/{es → esm}/core-nodejs.js.map +1 -1
  22. package/dist/{es → esm}/core.js +40 -12
  23. package/dist/esm/core.js.map +1 -0
  24. package/dist/{es → esm}/elements.js.map +1 -1
  25. package/dist/{es → esm}/html-validate.js +3 -3
  26. package/dist/esm/html-validate.js.map +1 -0
  27. package/dist/{es → esm}/jest-worker.js.map +1 -1
  28. package/dist/{es → esm}/matcher-utils.js.map +1 -1
  29. package/dist/{es → esm}/matchers-jestonly.js.map +1 -1
  30. package/dist/{es → esm}/matchers.js.map +1 -1
  31. package/dist/{es → esm}/meta-helper.js.map +1 -1
  32. package/dist/tsdoc-metadata.json +1 -1
  33. package/package.json +20 -27
  34. package/browser.d.ts +0 -1
  35. package/browser.js +0 -1
  36. package/dist/es/cli.js.map +0 -1
  37. package/dist/es/core.js.map +0 -1
  38. package/dist/es/html-validate.js.map +0 -1
  39. package/elements/html5.js +0 -1
  40. package/jest.d.ts +0 -1
  41. package/jest.js +0 -1
  42. package/node.d.ts +0 -1
  43. package/node.js +0 -1
  44. package/test-utils.d.ts +0 -1
  45. package/test-utils.js +0 -1
  46. /package/dist/{es → esm}/browser.d.ts +0 -0
  47. /package/dist/{es → esm}/browser.js +0 -0
  48. /package/dist/{es → esm}/browser.js.map +0 -0
  49. /package/dist/{es → esm}/core-browser.js +0 -0
  50. /package/dist/{es → esm}/core-nodejs.js +0 -0
  51. /package/dist/{es → esm}/elements.js +0 -0
  52. /package/dist/{es → esm}/html-validate.d.ts +0 -0
  53. /package/dist/{es → esm}/html5.d.ts +0 -0
  54. /package/dist/{es → esm}/html5.js +0 -0
  55. /package/dist/{es → esm}/html5.js.map +0 -0
  56. /package/dist/{es → esm}/index.d.ts +0 -0
  57. /package/dist/{es → esm}/index.js +0 -0
  58. /package/dist/{es → esm}/index.js.map +0 -0
  59. /package/dist/{es → esm}/jest-diff.js +0 -0
  60. /package/dist/{es → esm}/jest-diff.js.map +0 -0
  61. /package/dist/{es → esm}/jest-worker.d.ts +0 -0
  62. /package/dist/{es → esm}/jest-worker.js +0 -0
  63. /package/dist/{es → esm}/jest.d.ts +0 -0
  64. /package/dist/{es → esm}/jest.js +0 -0
  65. /package/dist/{es → esm}/jest.js.map +0 -0
  66. /package/dist/{es → esm}/matcher-utils.js +0 -0
  67. /package/dist/{es → esm}/matchers-jestonly.js +0 -0
  68. /package/dist/{es → esm}/matchers.js +0 -0
  69. /package/dist/{es → esm}/meta-helper.js +0 -0
  70. /package/dist/{es → esm}/package.json +0 -0
  71. /package/dist/{es → esm}/test-utils.d.ts +0 -0
  72. /package/dist/{es → esm}/test-utils.js +0 -0
  73. /package/dist/{es → esm}/test-utils.js.map +0 -0
  74. /package/dist/{es → esm}/utils/natural-join.js +0 -0
  75. /package/dist/{es → esm}/utils/natural-join.js.map +0 -0
  76. /package/dist/{es → esm}/vitest.d.ts +0 -0
  77. /package/dist/{es → esm}/vitest.js +0 -0
  78. /package/dist/{es → esm}/vitest.js.map +0 -0
  79. /package/{elements → dist/types}/html5.d.ts +0 -0
@@ -387,7 +387,7 @@ var deepmerge = /*@__PURE__*/getDefaultExportFromCjs(cjsExports);
387
387
 
388
388
  function stringify(value) {
389
389
  if (typeof value === "string") {
390
- return String(value);
390
+ return value;
391
391
  } else {
392
392
  return JSON.stringify(value);
393
393
  }
@@ -1508,6 +1508,7 @@ var State = /* @__PURE__ */ ((State2) => {
1508
1508
  State2[State2["CDATA"] = 6] = "CDATA";
1509
1509
  State2[State2["SCRIPT"] = 7] = "SCRIPT";
1510
1510
  State2[State2["STYLE"] = 8] = "STYLE";
1511
+ State2[State2["TEXTAREA"] = 9] = "TEXTAREA";
1511
1512
  return State2;
1512
1513
  })(State || {});
1513
1514
 
@@ -1515,6 +1516,7 @@ var ContentModel = /* @__PURE__ */ ((ContentModel2) => {
1515
1516
  ContentModel2[ContentModel2["TEXT"] = 1] = "TEXT";
1516
1517
  ContentModel2[ContentModel2["SCRIPT"] = 2] = "SCRIPT";
1517
1518
  ContentModel2[ContentModel2["STYLE"] = 3] = "STYLE";
1519
+ ContentModel2[ContentModel2["TEXTAREA"] = 4] = "TEXTAREA";
1518
1520
  return ContentModel2;
1519
1521
  })(ContentModel || {});
1520
1522
  class Context {
@@ -1538,9 +1540,6 @@ class Context {
1538
1540
  return JSON.stringify(this.string.length > n ? `${this.string.slice(0, 10)}...` : this.string);
1539
1541
  }
1540
1542
  consume(n, state) {
1541
- if (typeof n !== "number") {
1542
- n = n[0].length;
1543
- }
1544
1543
  let consumed = this.string.slice(0, n);
1545
1544
  let offset;
1546
1545
  while ((offset = consumed.indexOf("\n")) >= 0) {
@@ -2400,7 +2399,7 @@ function isElementNode(node) {
2400
2399
  return Boolean(node && node.nodeType === NodeType.ELEMENT_NODE);
2401
2400
  }
2402
2401
  function isInvalidTagName(tagName) {
2403
- return Boolean(tagName === "" || tagName === "*");
2402
+ return tagName === "" || tagName === "*";
2404
2403
  }
2405
2404
  function createAdapter(node) {
2406
2405
  return {
@@ -4696,6 +4695,8 @@ const MATCH_SCRIPT_DATA = /^[^]*?(?=<\/script)/;
4696
4695
  const MATCH_SCRIPT_END = /^<(\/)(script)/;
4697
4696
  const MATCH_STYLE_DATA = /^[^]*?(?=<\/style)/;
4698
4697
  const MATCH_STYLE_END = /^<(\/)(style)/;
4698
+ const MATCH_TEXTAREA_DATA = /^[^]*?(?=<\/textarea)/;
4699
+ const MATCH_TEXTAREA_END = /^<(\/)(textarea)/;
4699
4700
  const MATCH_DIRECTIVE = /^(<!--\s*\[html-validate-)([a-z0-9-]+)(\s*)(.*?)(]?\s*-->)/;
4700
4701
  const MATCH_COMMENT = /^<!--([^]*?)-->/;
4701
4702
  const MATCH_CONDITIONAL = /^<!\[([^\]]*?)\]>/;
@@ -4738,6 +4739,9 @@ class Lexer {
4738
4739
  case State.STYLE:
4739
4740
  yield* this.tokenizeStyle(context);
4740
4741
  break;
4742
+ case State.TEXTAREA:
4743
+ yield* this.tokenizeTextarea(context);
4744
+ break;
4741
4745
  /* istanbul ignore next: sanity check: should not happen unless adding new states */
4742
4746
  default:
4743
4747
  this.unhandled(context);
@@ -4793,7 +4797,7 @@ class Lexer {
4793
4797
  yield token;
4794
4798
  }
4795
4799
  const state = this.evalNextState(nextState, token);
4796
- context.consume(match, state);
4800
+ context.consume(match[0].length, state);
4797
4801
  this.enter(context, state, match);
4798
4802
  return;
4799
4803
  }
@@ -4810,6 +4814,8 @@ class Lexer {
4810
4814
  context.contentModel = ContentModel.SCRIPT;
4811
4815
  } else if (data[0] === "<style") {
4812
4816
  context.contentModel = ContentModel.STYLE;
4817
+ } else if (data[0] === "<textarea") {
4818
+ context.contentModel = ContentModel.TEXTAREA;
4813
4819
  } else {
4814
4820
  context.contentModel = ContentModel.TEXT;
4815
4821
  }
@@ -4845,21 +4851,28 @@ class Lexer {
4845
4851
  *tokenizeTag(context) {
4846
4852
  function nextState(token) {
4847
4853
  const tagCloseToken = token;
4854
+ const selfClosed = tagCloseToken && !tagCloseToken.data[0].startsWith("/");
4848
4855
  switch (context.contentModel) {
4849
4856
  case ContentModel.TEXT:
4850
4857
  return State.TEXT;
4851
4858
  case ContentModel.SCRIPT:
4852
- if (tagCloseToken && !tagCloseToken.data[0].startsWith("/")) {
4859
+ if (selfClosed) {
4853
4860
  return State.SCRIPT;
4854
4861
  } else {
4855
4862
  return State.TEXT;
4856
4863
  }
4857
4864
  case ContentModel.STYLE:
4858
- if (tagCloseToken && !tagCloseToken.data[0].startsWith("/")) {
4865
+ if (selfClosed) {
4859
4866
  return State.STYLE;
4860
4867
  } else {
4861
4868
  return State.TEXT;
4862
4869
  }
4870
+ case ContentModel.TEXTAREA:
4871
+ if (selfClosed) {
4872
+ return State.TEXTAREA;
4873
+ } else {
4874
+ return State.TEXT;
4875
+ }
4863
4876
  }
4864
4877
  }
4865
4878
  yield* this.match(
@@ -4924,6 +4937,16 @@ class Lexer {
4924
4937
  "expected </style>"
4925
4938
  );
4926
4939
  }
4940
+ *tokenizeTextarea(context) {
4941
+ yield* this.match(
4942
+ context,
4943
+ [
4944
+ [MATCH_TEXTAREA_END, State.TAG, TokenType.TAG_OPEN],
4945
+ [MATCH_TEXTAREA_DATA, State.TEXTAREA, TokenType.TEXT]
4946
+ ],
4947
+ "expected </textarea>"
4948
+ );
4949
+ }
4927
4950
  }
4928
4951
 
4929
4952
  const whitespace = /(\s+)/;
@@ -8145,6 +8168,9 @@ class NoRawCharacters extends Rule {
8145
8168
  setup() {
8146
8169
  this.on("element:ready", (event) => {
8147
8170
  const node = event.target;
8171
+ if (node.matches("script, style")) {
8172
+ return;
8173
+ }
8148
8174
  for (const child of node.childNodes) {
8149
8175
  if (child.nodeType !== NodeType.TEXT_NODE) {
8150
8176
  continue;
@@ -10298,7 +10324,7 @@ class H32 extends Rule {
10298
10324
  }
10299
10325
  function isSubmit(node) {
10300
10326
  const type = node.getAttribute("type");
10301
- return Boolean(!type || type.valueMatches(/submit|image/));
10327
+ return !type || type.valueMatches(/submit|image/);
10302
10328
  }
10303
10329
  function isAssociated(id, node) {
10304
10330
  const form = node.getAttribute("form");
@@ -10400,7 +10426,7 @@ class H37 extends Rule {
10400
10426
  if (!inAccessibilityTree(node)) {
10401
10427
  return;
10402
10428
  }
10403
- if (Boolean(node.getAttributeValue("alt")) || Boolean(node.hasAttribute("alt") && this.options.allowEmpty)) {
10429
+ if (Boolean(node.getAttributeValue("alt")) || node.hasAttribute("alt") && this.options.allowEmpty) {
10404
10430
  return;
10405
10431
  }
10406
10432
  for (const attr of this.options.alias) {
@@ -11797,7 +11823,7 @@ class EventHandler {
11797
11823
  }
11798
11824
 
11799
11825
  const name = "html-validate";
11800
- const version = "9.7.1";
11826
+ const version = "10.1.0";
11801
11827
  const bugs = "https://gitlab.com/html-validate/html-validate/issues/new";
11802
11828
 
11803
11829
  function freeze(src) {
@@ -12101,6 +12127,8 @@ class Parser {
12101
12127
  break;
12102
12128
  case TokenType.TEXT:
12103
12129
  case TokenType.TEMPLATING:
12130
+ case TokenType.SCRIPT:
12131
+ case TokenType.STYLE:
12104
12132
  this.appendText(token.data[0], token.location);
12105
12133
  break;
12106
12134
  case TokenType.EOF:
@@ -14194,7 +14222,7 @@ var ignoreExports = /*@__PURE__*/ requireIgnore();
14194
14222
  var ignore = /*@__PURE__*/getDefaultExportFromCjs(ignoreExports);
14195
14223
 
14196
14224
  const engines = {
14197
- node: "^18.19.0 || >= 20.6.0"
14225
+ node: "^20.19.0 || >= 22.12.0"
14198
14226
  };
14199
14227
 
14200
14228
  var workerPath = "./jest-worker.js";