html-validate 10.8.0 → 10.9.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.
package/dist/cjs/core.js CHANGED
@@ -4008,7 +4008,7 @@ class Rule {
4008
4008
  }
4009
4009
  }
4010
4010
 
4011
- const defaults$A = {
4011
+ const defaults$B = {
4012
4012
  allowExternal: true,
4013
4013
  allowRelative: true,
4014
4014
  allowAbsolute: true,
@@ -4052,7 +4052,7 @@ class AllowedLinks extends Rule {
4052
4052
  allowRelative;
4053
4053
  allowAbsolute;
4054
4054
  constructor(options) {
4055
- super({ ...defaults$A, ...options });
4055
+ super({ ...defaults$B, ...options });
4056
4056
  this.allowExternal = parseAllow(this.options.allowExternal);
4057
4057
  this.allowRelative = parseAllow(this.options.allowRelative);
4058
4058
  this.allowAbsolute = parseAllow(this.options.allowAbsolute);
@@ -4220,7 +4220,7 @@ class AllowedLinks extends Rule {
4220
4220
  }
4221
4221
  }
4222
4222
 
4223
- const defaults$z = {
4223
+ const defaults$A = {
4224
4224
  accessible: true
4225
4225
  };
4226
4226
  function findByTarget(target, siblings) {
@@ -4250,7 +4250,7 @@ function getDescription$1(context) {
4250
4250
  }
4251
4251
  class AreaAlt extends Rule {
4252
4252
  constructor(options) {
4253
- super({ ...defaults$z, ...options });
4253
+ super({ ...defaults$A, ...options });
4254
4254
  }
4255
4255
  static schema() {
4256
4256
  return {
@@ -4329,7 +4329,7 @@ class AriaHiddenBody extends Rule {
4329
4329
  }
4330
4330
  }
4331
4331
 
4332
- const defaults$y = {
4332
+ const defaults$z = {
4333
4333
  allowAnyNamable: false,
4334
4334
  elements: {
4335
4335
  include: null,
@@ -4377,7 +4377,7 @@ function isValidUsage(target, meta) {
4377
4377
  }
4378
4378
  class AriaLabelMisuse extends Rule {
4379
4379
  constructor(options) {
4380
- super({ ...defaults$y, ...options });
4380
+ super({ ...defaults$z, ...options });
4381
4381
  }
4382
4382
  static schema() {
4383
4383
  return {
@@ -4546,14 +4546,14 @@ class CaseStyle {
4546
4546
  }
4547
4547
  }
4548
4548
 
4549
- const defaults$x = {
4549
+ const defaults$y = {
4550
4550
  style: "lowercase",
4551
4551
  ignoreForeign: true
4552
4552
  };
4553
4553
  class AttrCase extends Rule {
4554
4554
  style;
4555
4555
  constructor(options) {
4556
- super({ ...defaults$x, ...options });
4556
+ super({ ...defaults$y, ...options });
4557
4557
  this.style = new CaseStyle(this.options.style, "attr-case");
4558
4558
  }
4559
4559
  static schema() {
@@ -4958,7 +4958,7 @@ class AttrDelimiter extends Rule {
4958
4958
  }
4959
4959
 
4960
4960
  const DEFAULT_PATTERN = "[a-z0-9-:]+";
4961
- const defaults$w = {
4961
+ const defaults$x = {
4962
4962
  pattern: DEFAULT_PATTERN,
4963
4963
  ignoreForeign: true
4964
4964
  };
@@ -4991,7 +4991,7 @@ function generateDescription(name, pattern) {
4991
4991
  class AttrPattern extends Rule {
4992
4992
  pattern;
4993
4993
  constructor(options) {
4994
- super({ ...defaults$w, ...options });
4994
+ super({ ...defaults$x, ...options });
4995
4995
  this.pattern = generateRegexp(this.options.pattern);
4996
4996
  }
4997
4997
  static schema() {
@@ -5038,7 +5038,7 @@ class AttrPattern extends Rule {
5038
5038
  }
5039
5039
  }
5040
5040
 
5041
- const defaults$v = {
5041
+ const defaults$w = {
5042
5042
  style: "auto",
5043
5043
  unquoted: false
5044
5044
  };
@@ -5104,7 +5104,7 @@ class AttrQuotes extends Rule {
5104
5104
  };
5105
5105
  }
5106
5106
  constructor(options) {
5107
- super({ ...defaults$v, ...options });
5107
+ super({ ...defaults$w, ...options });
5108
5108
  this.style = parseStyle$3(this.options.style);
5109
5109
  }
5110
5110
  setup() {
@@ -5260,13 +5260,13 @@ class AttributeAllowedValues extends Rule {
5260
5260
  }
5261
5261
  }
5262
5262
 
5263
- const defaults$u = {
5263
+ const defaults$v = {
5264
5264
  style: "omit"
5265
5265
  };
5266
5266
  class AttributeBooleanStyle extends Rule {
5267
5267
  hasInvalidStyle;
5268
5268
  constructor(options) {
5269
- super({ ...defaults$u, ...options });
5269
+ super({ ...defaults$v, ...options });
5270
5270
  this.hasInvalidStyle = parseStyle$2(this.options.style);
5271
5271
  }
5272
5272
  static schema() {
@@ -5336,13 +5336,13 @@ function reportMessage$1(attr, style) {
5336
5336
  return "";
5337
5337
  }
5338
5338
 
5339
- const defaults$t = {
5339
+ const defaults$u = {
5340
5340
  style: "omit"
5341
5341
  };
5342
5342
  class AttributeEmptyStyle extends Rule {
5343
5343
  hasInvalidStyle;
5344
5344
  constructor(options) {
5345
- super({ ...defaults$t, ...options });
5345
+ super({ ...defaults$u, ...options });
5346
5346
  this.hasInvalidStyle = parseStyle$1(this.options.style);
5347
5347
  }
5348
5348
  static schema() {
@@ -5459,7 +5459,7 @@ class AttributeMisuse extends Rule {
5459
5459
  }
5460
5460
  }
5461
5461
 
5462
- const defaults$s = {
5462
+ const defaults$t = {
5463
5463
  preferred: void 0
5464
5464
  };
5465
5465
  function isPasswordInput(event) {
@@ -5476,7 +5476,7 @@ function isGroupingToken(token) {
5476
5476
  class AutocompletePassword extends Rule {
5477
5477
  preferred;
5478
5478
  constructor(options) {
5479
- super({ ...defaults$s, ...options });
5479
+ super({ ...defaults$t, ...options });
5480
5480
  this.preferred = options.preferred?.toLowerCase();
5481
5481
  }
5482
5482
  static schema() {
@@ -5706,7 +5706,7 @@ class BasePatternRule extends Rule {
5706
5706
  }
5707
5707
  }
5708
5708
 
5709
- const defaults$r = {
5709
+ const defaults$s = {
5710
5710
  pattern: "kebabcase"
5711
5711
  };
5712
5712
  class ClassPattern extends BasePatternRule {
@@ -5714,7 +5714,7 @@ class ClassPattern extends BasePatternRule {
5714
5714
  super({
5715
5715
  ruleId: "class-pattern",
5716
5716
  attr: "class",
5717
- options: { ...defaults$r, ...options },
5717
+ options: { ...defaults$s, ...options },
5718
5718
  allowedPatterns: patternNames
5719
5719
  // allow all patterns
5720
5720
  });
@@ -5864,13 +5864,13 @@ class CloseOrder extends Rule {
5864
5864
  }
5865
5865
  }
5866
5866
 
5867
- const defaults$q = {
5867
+ const defaults$r = {
5868
5868
  include: null,
5869
5869
  exclude: null
5870
5870
  };
5871
5871
  class Deprecated extends Rule {
5872
5872
  constructor(options) {
5873
- super({ ...defaults$q, ...options });
5873
+ super({ ...defaults$r, ...options });
5874
5874
  }
5875
5875
  static schema() {
5876
5876
  return {
@@ -5978,6 +5978,137 @@ function prettySource(source) {
5978
5978
  }
5979
5979
  }
5980
5980
 
5981
+ function quote(value, char = '"') {
5982
+ return `${char}${value}${char}`;
5983
+ }
5984
+
5985
+ const defaults$q = {
5986
+ classes: []
5987
+ };
5988
+ function isRelevant$6(event) {
5989
+ return event.key.toLowerCase() === "class";
5990
+ }
5991
+ function normalizeEntry(entry) {
5992
+ const { class: className, message, replacement = [], url } = entry;
5993
+ return {
5994
+ class: className,
5995
+ message,
5996
+ replacement: Array.isArray(replacement) ? replacement : [replacement],
5997
+ url
5998
+ };
5999
+ }
6000
+ function formatDeprecatedMessage(className, entry) {
6001
+ let message = `class "${className}" is deprecated`;
6002
+ if (entry.replacement.length > 0) {
6003
+ const joined = utils_naturalJoin.naturalJoin(
6004
+ entry.replacement.map((r) => quote(r)),
6005
+ "or"
6006
+ );
6007
+ message += ` and replaced with ${joined}`;
6008
+ }
6009
+ if (entry.message) {
6010
+ message += `: ${entry.message}`;
6011
+ }
6012
+ return message;
6013
+ }
6014
+ function formatDocumentationDescription(context) {
6015
+ const text = [];
6016
+ const className = context.class;
6017
+ let description = `The class \`${className}\` is deprecated and should not be used`;
6018
+ if (context.message) {
6019
+ description += `: ${context.message}.`;
6020
+ } else {
6021
+ description += ".";
6022
+ }
6023
+ text.push(description);
6024
+ if (context.replacement.length === 1) {
6025
+ text.push(`Use the replacement class ${quote(context.replacement[0], "`")} instead.`);
6026
+ } else if (context.replacement.length > 1) {
6027
+ const listItems = context.replacement.map((r) => `- ${quote(r, "`")}`);
6028
+ text.push(`Use one of the following replacement classes instead:
6029
+ ${listItems.join("\n")}`);
6030
+ }
6031
+ if (context.url) {
6032
+ text.push(`For details see: ${context.url}`);
6033
+ }
6034
+ return text.join("\n\n");
6035
+ }
6036
+ class DeprecatedClass extends Rule {
6037
+ deprecatedMap;
6038
+ constructor(options) {
6039
+ super({ ...defaults$q, ...options });
6040
+ const { classes } = this.options;
6041
+ this.deprecatedMap = new Map(classes.map((entry) => [entry.class, normalizeEntry(entry)]));
6042
+ }
6043
+ static schema() {
6044
+ return {
6045
+ classes: {
6046
+ type: "array",
6047
+ items: {
6048
+ type: "object",
6049
+ properties: {
6050
+ class: {
6051
+ type: "string"
6052
+ },
6053
+ message: {
6054
+ type: "string"
6055
+ },
6056
+ replacement: {
6057
+ anyOf: [
6058
+ {
6059
+ type: "string"
6060
+ },
6061
+ {
6062
+ type: "array",
6063
+ items: {
6064
+ type: "string"
6065
+ }
6066
+ }
6067
+ ]
6068
+ },
6069
+ url: {
6070
+ type: "string"
6071
+ }
6072
+ },
6073
+ required: ["class"],
6074
+ additionalProperties: false
6075
+ }
6076
+ }
6077
+ };
6078
+ }
6079
+ documentation(context) {
6080
+ return {
6081
+ description: formatDocumentationDescription(context),
6082
+ url: "https://html-validate.org/rules/deprecated-class.html"
6083
+ };
6084
+ }
6085
+ setup() {
6086
+ this.on("attr", isRelevant$6, (event) => {
6087
+ const { value, valueLocation, target } = event;
6088
+ const classes = new DOMTokenList(value, valueLocation);
6089
+ for (const { item, location } of classes.iterator()) {
6090
+ const deprecatedEntry = this.deprecatedMap.get(item);
6091
+ if (!deprecatedEntry) {
6092
+ continue;
6093
+ }
6094
+ const message = formatDeprecatedMessage(item, deprecatedEntry);
6095
+ const context = {
6096
+ class: item,
6097
+ message: deprecatedEntry.message ?? null,
6098
+ replacement: deprecatedEntry.replacement,
6099
+ url: deprecatedEntry.url ?? null
6100
+ };
6101
+ this.report({
6102
+ node: target,
6103
+ message,
6104
+ location,
6105
+ context
6106
+ });
6107
+ }
6108
+ });
6109
+ }
6110
+ }
6111
+
5981
6112
  class DeprecatedRule extends Rule {
5982
6113
  documentation(context) {
5983
6114
  const preamble = context ? `The rule "${context}"` : "This rule";
@@ -10918,6 +11049,7 @@ const bundledRules = {
10918
11049
  "close-attr": CloseAttr,
10919
11050
  "close-order": CloseOrder,
10920
11051
  deprecated: Deprecated,
11052
+ "deprecated-class": DeprecatedClass,
10921
11053
  "deprecated-rule": DeprecatedRule,
10922
11054
  "doctype-html": NoStyleTag$1,
10923
11055
  "doctype-style": DoctypeStyle,
@@ -12294,7 +12426,7 @@ class EventHandler {
12294
12426
  }
12295
12427
 
12296
12428
  const name = "html-validate";
12297
- const version = "10.8.0";
12429
+ const version = "10.9.0";
12298
12430
  const bugs = "https://gitlab.com/html-validate/html-validate/issues/new";
12299
12431
 
12300
12432
  function freeze(src) {