html-validate-vue 7.3.1 → 7.4.1

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/README.md CHANGED
@@ -55,16 +55,18 @@ If you're using Vue CLI you can add the CLI plugin:
55
55
  | Rule | Recommended | Description |
56
56
  | --------------------------- | ----------- | ------------------------------------------------------ |
57
57
  | `vue/available-slots` | Error | Validate usage of slots. Only known slots may be used. |
58
+ | `vue/deprecated-slot` | Error | Report errors when deprecated slots are used. |
58
59
  | `vue/prefer-slot-shorthand` | Error | Prefers the usage of `#foo` over `v-slot:foo`. |
59
60
  | `vue/required-slots` | Error | Validate required slots. Required slots must be used. |
60
61
 
61
62
  ## Element metadata
62
63
 
63
- | Property | Datatype | Description |
64
- | ------------- | ---------- | ---------------------------------------------------- |
65
- | component | `string` | Component uses `<component is="..">` to wrap content |
66
- | slots | `string[]` | List of available slots. |
67
- | requiredSlots | `string[]` | List of required slots. |
64
+ | Property | Datatype | Description |
65
+ | --------------- | ----------------------------------- | ---------------------------------------------------- |
66
+ | component | `string` | Component uses `<component is="..">` to wrap content |
67
+ | slots | `string[]` | List of available slots. |
68
+ | requiredSlots | `string[]` | List of required slots. |
69
+ | deprecatedSlots | `Record<string, string \| boolean>` | List of deprecated slots (with optional message). |
68
70
 
69
71
  ### Slots
70
72
 
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
 
3
3
  // src/index.ts
4
- var import_html_validate7 = require("html-validate");
4
+ var import_html_validate8 = require("html-validate");
5
5
 
6
6
  // package.json
7
7
  var name = "html-validate-vue";
8
8
  var peerDependencies = {
9
- "html-validate": "^8.10.0 || ^9.0.0 || ^10.0.0"
9
+ "html-validate": "^8.21.0 || ^9.0.0 || ^10.0.0"
10
10
  };
11
11
 
12
12
  // src/elements.ts
@@ -160,7 +160,7 @@ var AvailableSlots = class extends import_html_validate2.Rule {
160
160
  setup() {
161
161
  this.on("dom:ready", (event) => {
162
162
  const doc = event.document;
163
- doc.visitDepthFirst((node) => {
163
+ import_html_validate2.walk.depthFirst(doc, (node) => {
164
164
  const meta = node.meta;
165
165
  if (!meta?.slots) {
166
166
  return;
@@ -190,8 +190,59 @@ var AvailableSlots = class extends import_html_validate2.Rule {
190
190
  }
191
191
  };
192
192
 
193
- // src/rules/prefer-slot-shorthand.ts
193
+ // src/rules/deprecated-slot.ts
194
194
  var import_html_validate3 = require("html-validate");
195
+ var DeprecatedSlot = class extends import_html_validate3.Rule {
196
+ documentation(context) {
197
+ if (context) {
198
+ const preamble = `The slot \`${context.slot}\` is deprecated and must not be used`;
199
+ return {
200
+ description: context.info ? `${preamble}: ${context.info}.` : `${preamble}.`
201
+ };
202
+ } else {
203
+ return {
204
+ description: "This slot is deprecated and must not be used."
205
+ };
206
+ }
207
+ }
208
+ setup() {
209
+ this.on("dom:ready", (event) => {
210
+ const doc = event.document;
211
+ import_html_validate3.walk.depthFirst(doc, (node) => {
212
+ const deprecatedSlots = node.meta?.deprecatedSlots;
213
+ if (!deprecatedSlots) {
214
+ return;
215
+ }
216
+ this.validateSlots(node, deprecatedSlots);
217
+ });
218
+ });
219
+ }
220
+ validateSlots(node, deprecatedSlots) {
221
+ const slots = findUsedSlots(node);
222
+ for (const [slot, location] of slots.entries()) {
223
+ const deprecated = deprecatedSlots[slot];
224
+ if (!deprecated) {
225
+ continue;
226
+ }
227
+ const context = {
228
+ element: node.tagName,
229
+ slot,
230
+ info: typeof deprecated === "string" ? deprecated : null
231
+ };
232
+ const preamble = `slot "${slot}" is deprecated`;
233
+ const message = typeof deprecated === "string" ? `${preamble}: ${deprecated}` : preamble;
234
+ this.report({
235
+ node,
236
+ message,
237
+ location,
238
+ context
239
+ });
240
+ }
241
+ }
242
+ };
243
+
244
+ // src/rules/prefer-slot-shorthand.ts
245
+ var import_html_validate4 = require("html-validate");
195
246
  var prefix = "v-slot:";
196
247
  function isVSlot(attr) {
197
248
  if (!attr.startsWith(prefix)) {
@@ -210,7 +261,7 @@ function isDeprecatedSlot(attr, value) {
210
261
  if (attr !== "slot") {
211
262
  return null;
212
263
  }
213
- if (value instanceof import_html_validate3.DynamicValue) {
264
+ if (value instanceof import_html_validate4.DynamicValue) {
214
265
  return null;
215
266
  }
216
267
  if (value === null || value === "") {
@@ -218,7 +269,7 @@ function isDeprecatedSlot(attr, value) {
218
269
  }
219
270
  return value;
220
271
  }
221
- var PreferSlotShorthand = class extends import_html_validate3.Rule {
272
+ var PreferSlotShorthand = class extends import_html_validate4.Rule {
222
273
  documentation(context) {
223
274
  const slot = context?.slot ?? "my-slot";
224
275
  return {
@@ -250,7 +301,7 @@ var PreferSlotShorthand = class extends import_html_validate3.Rule {
250
301
  };
251
302
 
252
303
  // src/rules/required-slots.ts
253
- var import_html_validate4 = require("html-validate");
304
+ var import_html_validate5 = require("html-validate");
254
305
  function difference2(a, b) {
255
306
  const result = new Set(a);
256
307
  for (const elem of b) {
@@ -258,7 +309,7 @@ function difference2(a, b) {
258
309
  }
259
310
  return result;
260
311
  }
261
- var RequiredSlots = class extends import_html_validate4.Rule {
312
+ var RequiredSlots = class extends import_html_validate5.Rule {
262
313
  documentation(context) {
263
314
  if (context) {
264
315
  return {
@@ -277,7 +328,7 @@ var RequiredSlots = class extends import_html_validate4.Rule {
277
328
  setup() {
278
329
  this.on("dom:ready", (event) => {
279
330
  const doc = event.document;
280
- doc.visitDepthFirst((node) => {
331
+ import_html_validate5.walk.depthFirst(doc, (node) => {
281
332
  const meta = node.meta;
282
333
  if (!meta?.requiredSlots) {
283
334
  return;
@@ -310,6 +361,7 @@ var RequiredSlots = class extends import_html_validate4.Rule {
310
361
  // src/rules/index.ts
311
362
  var rules = {
312
363
  "vue/available-slots": AvailableSlots,
364
+ "vue/deprecated-slot": DeprecatedSlot,
313
365
  "vue/prefer-slot-shorthand": PreferSlotShorthand,
314
366
  "vue/required-slots": RequiredSlots
315
367
  };
@@ -322,6 +374,14 @@ var schema_default = {
322
374
  type: "string",
323
375
  copyable: true
324
376
  },
377
+ deprecatedSlots: {
378
+ type: "object",
379
+ patternProperties: {
380
+ ".*": {
381
+ anyOf: [{ type: "boolean" }, { type: "string" }]
382
+ }
383
+ }
384
+ },
325
385
  requiredSlots: {
326
386
  type: "array",
327
387
  items: {
@@ -338,7 +398,7 @@ var schema_default = {
338
398
  };
339
399
 
340
400
  // src/hooks/attribute.ts
341
- var import_html_validate5 = require("html-validate");
401
+ var import_html_validate6 = require("html-validate");
342
402
  function* processAttribute(attr) {
343
403
  yield attr;
344
404
  const bind = /^(?:v-bind)?:(.*)$/.exec(attr.key);
@@ -347,14 +407,14 @@ function* processAttribute(attr) {
347
407
  yield {
348
408
  ...attr,
349
409
  key,
350
- value: new import_html_validate5.DynamicValue(attr.value ? String(attr.value) : ""),
410
+ value: new import_html_validate6.DynamicValue(attr.value ? String(attr.value) : ""),
351
411
  originalAttribute: attr.key
352
412
  };
353
413
  }
354
414
  }
355
415
 
356
416
  // src/hooks/element.ts
357
- var import_html_validate6 = require("html-validate");
417
+ var import_html_validate7 = require("html-validate");
358
418
  function isBound(node) {
359
419
  return node.hasAttribute("v-html");
360
420
  }
@@ -414,7 +474,7 @@ function processElement(node) {
414
474
  node.meta.templateRoot = false;
415
475
  }
416
476
  if (isBound(node) || isSlot(node)) {
417
- node.appendText(new import_html_validate6.DynamicValue(""), node.location);
477
+ node.appendText(new import_html_validate7.DynamicValue(""), node.location);
418
478
  }
419
479
  }
420
480
 
@@ -530,7 +590,7 @@ var transform_default = transformer;
530
590
 
531
591
  // src/index.ts
532
592
  var range = peerDependencies["html-validate"];
533
- (0, import_html_validate7.compatibilityCheck)(name, range);
593
+ (0, import_html_validate8.compatibilityCheck)(name, range);
534
594
  var plugin = {
535
595
  name,
536
596
  configs: configs_default,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/index.ts", "../../package.json", "../../src/elements.ts", "../../src/configs/recommended.ts", "../../src/configs/index.ts", "../../src/rules/available-slots.ts", "../../src/utils/strip-templating.ts", "../../src/utils/slots.ts", "../../src/rules/prefer-slot-shorthand.ts", "../../src/rules/required-slots.ts", "../../src/rules/index.ts", "../../src/schema.json", "../../src/hooks/attribute.ts", "../../src/hooks/element.ts", "../../src/transform/html.transform.ts", "../../src/transform/js.transform.ts", "../../src/transform/sfc.transform.ts", "../../src/transform/auto.transform.ts", "../../src/transform/index.ts", "../../src/entry-cjs.ts"],
4
- "sourcesContent": ["import { type Plugin, compatibilityCheck } from \"html-validate\";\nimport { name, peerDependencies } from \"../package.json\";\nimport configs from \"./configs\";\nimport rules from \"./rules\";\nimport elementSchema from \"./schema.json\";\nimport transformer from \"./transform\";\n\nconst range = peerDependencies[\"html-validate\"];\ncompatibilityCheck(name, range);\n\nconst plugin: Plugin = {\n\tname,\n\tconfigs,\n\trules,\n\ttransformer,\n\telementSchema,\n};\n\nexport default plugin;\n", "{\n \"name\": \"html-validate-vue\",\n \"version\": \"7.3.0\",\n \"description\": \"vue transform for html-validate\",\n \"keywords\": [\n \"html\",\n \"lint\",\n \"html-validate\",\n \"vue\"\n ],\n \"homepage\": \"https://html-validate.org/frameworks/vue.html\",\n \"bugs\": {\n \"url\": \"https://gitlab.com/html-validate/html-validate-vue/issues/new\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://gitlab.com/html-validate/html-validate-vue.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"David Sveningsson <ext@sidvind.com>\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/esm/index.d.mts\",\n \"default\": \"./dist/esm/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/cjs/index.d.cts\",\n \"default\": \"./dist/cjs/index.cjs\"\n }\n }\n },\n \"main\": \"dist/cjs/index.cjs\",\n \"module\": \"dist/esm/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"prebuild\": \"tsc\",\n \"build\": \"run-s build:*\",\n \"build:lib\": \"node build.mjs\",\n \"build:cjs\": \"dts-bundle-generator --no-banner --project tsconfig.cjs.json -o dist/cjs/index.d.cts src/entry-cjs.ts\",\n \"build:esm\": \"dts-bundle-generator --no-banner --project tsconfig.esm.json -o dist/esm/index.d.mts src/entry-esm.ts\",\n \"eslint\": \"eslint --cache .\",\n \"eslint:fix\": \"eslint --cache --fix .\",\n \"prepack\": \"release-prepack package.json --bundle\",\n \"postpack\": \"release-postpack package.json\",\n \"prepare\": \"husky\",\n \"prepublishOnly\": \"release-prepack package.json --bundle\",\n \"prettier:check\": \"prettier --check .\",\n \"prettier:write\": \"prettier --write .\",\n \"postpublish\": \"release-postpack package.json\",\n \"attw\": \"attw --no-emoji --pack .\",\n \"test\": \"jest\"\n },\n \"commitlint\": {\n \"extends\": \"@html-validate\"\n },\n \"prettier\": \"@html-validate/prettier-config\",\n \"release\": {\n \"extends\": \"@html-validate/semantic-release-config\"\n },\n \"jest\": {\n \"preset\": \"@html-validate/jest-config\"\n },\n \"dependencies\": {\n \"@html-validate/plugin-utils\": \"2.1.0\",\n \"semver\": \"7.7.3\"\n },\n \"devDependencies\": {\n \"@arethetypeswrong/cli\": \"0.18.2\",\n \"@html-validate/commitlint-config\": \"3.6.1\",\n \"@html-validate/eslint-config\": \"6.10.0\",\n \"@html-validate/eslint-config-jest\": \"6.10.0\",\n \"@html-validate/eslint-config-typescript\": \"6.10.0\",\n \"@html-validate/eslint-config-typescript-typeinfo\": \"6.10.0\",\n \"@html-validate/jest-config\": \"3.13.0\",\n \"@html-validate/prettier-config\": \"3.1.4\",\n \"@html-validate/release-scripts\": \"6.10.0\",\n \"@tsconfig/node18\": \"18.2.4\",\n \"@tsconfig/strictest\": \"2.0.6\",\n \"@types/estree\": \"1.0.8\",\n \"@types/jest\": \"29.5.14\",\n \"@types/node\": \"18.19.130\",\n \"@types/semver\": \"7.7.1\",\n \"dts-bundle-generator\": \"9.5.1\",\n \"esbuild\": \"0.25.10\",\n \"html-validate\": \"10.1.2\",\n \"husky\": \"9.1.7\",\n \"jest\": \"29.7.0\",\n \"jest-environment-jsdom\": \"29.7.0\",\n \"npm-pkg-lint\": \"4.1.2\",\n \"npm-run-all2\": \"8.0.4\",\n \"ts-jest\": \"29.4.5\",\n \"typescript\": \"5.9.3\"\n },\n \"peerDependencies\": {\n \"html-validate\": \"^8.10.0 || ^9.0.0 || ^10.0.0\"\n },\n \"engines\": {\n \"node\": \">= 18.0\"\n },\n \"externalDependencies\": [\n \"@html-validate/plugin-utils\"\n ]\n}\n", "import { defineMetadata } from \"html-validate\";\n\nexport default defineMetadata({\n\tcomponent: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tcomponent: \"is\",\n\t\trequiredAttributes: [\"is\"],\n\t},\n\n\t\"keep-alive\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\tportal: {\n\t\tdeprecated: {\n\t\t\tsource: \"vue\",\n\t\t\tmessage: \"the <portal> element has been renamed to <teleport>\",\n\t\t\tdocumentation: \"The `<portal>` element has been renamed to `<teleport>`\",\n\t\t},\n\t},\n\n\t\"router-link\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\t\"router-view\": {\n\t\tflow: true,\n\t\tslots: [\"default\"],\n\t},\n\n\tslot: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tscriptSupporting: true,\n\t},\n\n\tsuspense: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tslots: [\"default\", \"fallback\"],\n\t},\n\n\tteleport: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t},\n\n\ttransition: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\t\"transition-group\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tcomponent: \"tag\",\n\t},\n});\n", "import { type ConfigData } from \"html-validate\";\nimport vueElements from \"../elements\";\n\nexport function createConfig(): ConfigData {\n\tconst config: ConfigData = {\n\t\telements: [vueElements],\n\t\trules: {\n\t\t\t/* vue modifiers often use camelcase so allow by default */\n\t\t\t\"attr-case\": [\"error\", { style: \"camelcase\" }],\n\n\t\t\t/* self closing tags often used in vue code so allow by default*/\n\t\t\t\"void-style\": [\"error\", { style: \"selfclose\" }],\n\t\t\t\"no-self-closing\": \"off\",\n\n\t\t\t/* enable rules from this plugin */\n\t\t\t\"vue/available-slots\": \"error\",\n\t\t\t\"vue/prefer-slot-shorthand\": \"error\",\n\t\t\t\"vue/required-slots\": \"error\",\n\t\t},\n\t};\n\n\treturn config;\n}\n\nexport default createConfig();\n", "import recommended from \"./recommended\";\n\nexport default {\n\trecommended,\n};\n", "import { type DOMReadyEvent, type HtmlElement, type RuleDocumentation, Rule } from \"html-validate\";\nimport { findUsedSlots } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\tinterface MetaData {\n\t\tslots?: string[];\n\t}\n\tinterface MetaElement {\n\t\tslots?: string[];\n\t}\n}\n\ninterface Context {\n\telement: string;\n\tslot: string;\n\tavailable: string[];\n}\n\nfunction difference<T>(a: Set<T>, b: Set<T>): Set<T> {\n\tconst result = new Set(a);\n\tfor (const elem of b) {\n\t\tresult.delete(elem);\n\t}\n\treturn result;\n}\n\nexport class AvailableSlots extends Rule<Context> {\n\tpublic override documentation(context?: Context): RuleDocumentation {\n\t\tif (context) {\n\t\t\treturn {\n\t\t\t\tdescription: [\n\t\t\t\t\t`The <${context.element}> component does not have a slot named \"${context.slot}\". Only known slots can be specified.`,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"The following slots are available\",\n\t\t\t\t]\n\t\t\t\t\t.concat(context.available.map((slot) => `- ${slot}`))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdescription: \"Only known slots can be specified.\",\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"dom:ready\", (event: DOMReadyEvent) => {\n\t\t\tconst doc = event.document;\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-deprecated -- need to\n\t\t\t * use this for backwards compatibility until support for v7 is dropped */\n\t\t\tdoc.visitDepthFirst((node: HtmlElement) => {\n\t\t\t\t/* ignore rule if element has no meta or meta does not specify available slots */\n\t\t\t\tconst meta = node.meta;\n\t\t\t\tif (!meta?.slots) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.validateSlots(node, meta.slots);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate validateSlots(node: HtmlElement, slots: string[]): void {\n\t\tconst usedSlots = findUsedSlots(node);\n\t\tconst available = new Set(slots);\n\t\tconst used = new Set(usedSlots.keys());\n\t\tconst diff = difference(used, available);\n\n\t\tfor (const missing of diff) {\n\t\t\tconst context: Context = {\n\t\t\t\telement: node.tagName,\n\t\t\t\tslot: missing,\n\t\t\t\tavailable: slots,\n\t\t\t};\n\t\t\tthis.report(\n\t\t\t\tnode,\n\t\t\t\t`<${node.tagName}> component has no slot \"${missing}\"`,\n\t\t\t\tusedSlots.get(missing),\n\t\t\t\tcontext,\n\t\t\t);\n\t\t}\n\t}\n}\n", "/**\n * Strip anything inside `{{ .. }}` in case it contains anything that looks like\n * markup, i.e. it will be ignored\n */\nexport function stripTemplating(str: string): string {\n\t/* eslint-disable-next-line sonarjs/slow-regex -- technical debt, should refactor */\n\treturn str.replace(/{{(.*?)}}/g, (_, m: string) => {\n\t\tconst filler = \" \".repeat(m.length);\n\t\treturn `{{${filler}}}`;\n\t});\n}\n", "import { type HtmlElement, type Location } from \"html-validate\";\n\nconst slotAttr = /(?:v-slot:|#)([^[]+)/;\n\nfunction haveSlot(value: [string, Location] | null): value is [string, Location] {\n\treturn value !== null;\n}\n\n/**\n * Search all children for slots and return both slot names and locations.\n */\nexport function findUsedSlots(node: HtmlElement): Map<string, Location> {\n\tconst template = node.querySelectorAll(\">template, >[slot]\");\n\tconst slots = template.map((child) => findSlotAttribute(child)).filter(haveSlot);\n\tconst initial = new Map<string, Location>();\n\treturn slots.reduce((result: Map<string, Location>, [key, val]) => {\n\t\tresult.set(key, val);\n\t\treturn result;\n\t}, initial);\n}\n\n/**\n * Find the name of the slot and its location used by an element. Searches\n * both v-slot:foo and slot=\"foo\".\n */\nexport function findSlotAttribute(node: HtmlElement): [string, Location] | null {\n\tfor (const attr of node.attributes) {\n\t\t/* find v-slot directive */\n\t\tconst match = slotAttr.exec(attr.key);\n\t\tif (match) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if slot matches [1] will exist */\n\t\t\tconst slot = match[1]!;\n\t\t\treturn [slot, attr.keyLocation];\n\t\t}\n\n\t\t/* find deprecated slot attribute */\n\t\tif (attr.key === \"slot\" && typeof attr.value === \"string\") {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- valueLocation will always be set the value is present */\n\t\t\treturn [attr.value, attr.valueLocation!];\n\t\t}\n\t}\n\treturn null;\n}\n", "import { type AttributeEvent, type RuleDocumentation, DynamicValue, Rule } from \"html-validate\";\n\ninterface RuleContext {\n\tslot: string;\n}\n\nconst prefix = \"v-slot:\";\n\nfunction isVSlot(attr: string): string | null {\n\tif (!attr.startsWith(prefix)) {\n\t\treturn null;\n\t}\n\tif (attr.length <= prefix.length) {\n\t\treturn null;\n\t}\n\tconst slot = attr.slice(prefix.length);\n\tif (/^\\[.*\\]$/.exec(slot)) {\n\t\treturn null;\n\t}\n\treturn slot;\n}\n\nfunction isDeprecatedSlot(attr: string, value: null | string | DynamicValue): string | null {\n\tif (attr !== \"slot\") {\n\t\treturn null;\n\t}\n\tif (value instanceof DynamicValue) {\n\t\treturn null;\n\t}\n\tif (value === null || value === \"\") {\n\t\treturn null;\n\t}\n\treturn value;\n}\n\nexport class PreferSlotShorthand extends Rule<RuleContext> {\n\tpublic override documentation(context?: RuleContext): RuleDocumentation {\n\t\tconst slot = context?.slot ?? \"my-slot\";\n\t\treturn {\n\t\t\tdescription: [\n\t\t\t\t`Prefer to use \\`#${slot}\\` over \\`v-slot:${slot}\\`.`,\n\t\t\t\t\"\",\n\t\t\t\t\"Vue.js supports a shorthand syntax for slots using `#` instead of `v-slot:` or the deprecated `slot` attribute, e.g. using `#header` instead of `v-slot:header`.\",\n\t\t\t].join(\"\\n\"),\n\t\t};\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"attr\", (event: AttributeEvent) => {\n\t\t\tconst { key: attr, value, target, keyLocation: location } = event;\n\n\t\t\tlet slot: string | null;\n\n\t\t\t/* handle v-slot:xyz */\n\t\t\tslot = isVSlot(attr);\n\t\t\tif (slot) {\n\t\t\t\tconst context: RuleContext = { slot };\n\t\t\t\tconst message = `Prefer to use #${slot} over ${attr}`;\n\t\t\t\tthis.report(target, message, location, context);\n\t\t\t}\n\n\t\t\t/* handle slot=\"xyz\" */\n\t\t\tslot = isDeprecatedSlot(attr, value);\n\t\t\tif (slot) {\n\t\t\t\tconst context: RuleContext = { slot };\n\t\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- value is checked by isDeprecatedSlot */\n\t\t\t\tconst message = `Prefer to use #${slot} over ${attr}=\"${value!.toString()}\"`;\n\t\t\t\tthis.report(target, message, location, context);\n\t\t\t}\n\t\t});\n\t}\n}\n", "import { type DOMReadyEvent, type HtmlElement, type RuleDocumentation, Rule } from \"html-validate\";\nimport { findUsedSlots } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\tinterface MetaData {\n\t\trequiredSlots?: string[];\n\t}\n\tinterface MetaElement {\n\t\trequiredSlots?: string[];\n\t}\n}\n\ninterface Context {\n\telement: string;\n\tslot: string;\n\trequired: string[];\n}\n\nfunction difference<T>(a: Set<T>, b: Set<T>): Set<T> {\n\tconst result = new Set(a);\n\tfor (const elem of b) {\n\t\tresult.delete(elem);\n\t}\n\treturn result;\n}\n\nexport class RequiredSlots extends Rule<Context> {\n\tpublic override documentation(context?: Context): RuleDocumentation {\n\t\tif (context) {\n\t\t\treturn {\n\t\t\t\tdescription: [\n\t\t\t\t\t`The <${context.element}> component requires slot \"${context.slot}\" to be implemented. Add \\`<template v-slot:${context.slot}>\\``,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"The following slots are required\",\n\t\t\t\t]\n\t\t\t\t\t.concat(context.required.map((slot) => `- ${slot}`))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdescription: \"All required slots must be implemented.\",\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"dom:ready\", (event: DOMReadyEvent) => {\n\t\t\tconst doc = event.document;\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-deprecated -- need to\n\t\t\t * use this for backwards compatibility until support for v7 is dropped */\n\t\t\tdoc.visitDepthFirst((node: HtmlElement) => {\n\t\t\t\t/* ignore rule if element has no meta or meta does not specify available slots */\n\t\t\t\tconst meta = node.meta;\n\t\t\t\tif (!meta?.requiredSlots) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.validateSlots(node, meta.requiredSlots);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate validateSlots(node: HtmlElement, requiredSlots: string[]): void {\n\t\tconst usedSlots = findUsedSlots(node);\n\t\tconst required = new Set(requiredSlots);\n\t\tconst used = new Set(usedSlots.keys());\n\t\tconst diff = difference(required, used);\n\n\t\tfor (const missing of diff) {\n\t\t\tconst context: Context = {\n\t\t\t\telement: node.tagName,\n\t\t\t\tslot: missing,\n\t\t\t\trequired: requiredSlots,\n\t\t\t};\n\t\t\tthis.report(\n\t\t\t\tnode,\n\t\t\t\t`<${node.tagName}> component requires slot \"${missing}\" to be implemented`,\n\t\t\t\tnull,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t}\n\t}\n}\n", "import { AvailableSlots } from \"./available-slots\";\nimport { PreferSlotShorthand } from \"./prefer-slot-shorthand\";\nimport { RequiredSlots } from \"./required-slots\";\n\nconst rules = {\n\t\"vue/available-slots\": AvailableSlots,\n\t\"vue/prefer-slot-shorthand\": PreferSlotShorthand,\n\t\"vue/required-slots\": RequiredSlots,\n};\n\nexport default rules;\n", "{\n \"properties\": {\n \"component\": {\n \"type\": \"string\",\n \"copyable\": true\n },\n \"requiredSlots\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"slots\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n}\n", "import { type AttributeData, DynamicValue } from \"html-validate\";\n\nexport function* processAttribute(attr: AttributeData): Iterable<AttributeData> {\n\t/* always yield original attribute */\n\tyield attr;\n\n\t/* setup :foo and v-bind:foo alias */\n\tconst bind = /^(?:v-bind)?:(.*)$/.exec(attr.key);\n\tif (bind) {\n\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if bind matches [1] will exist */\n\t\tconst key = bind[1]!;\n\t\tyield {\n\t\t\t...attr,\n\t\t\tkey,\n\t\t\tvalue: new DynamicValue(attr.value ? String(attr.value) : \"\"),\n\t\t\toriginalAttribute: attr.key,\n\t\t};\n\t}\n}\n", "import {\n\ttype HtmlElement,\n\ttype MetaElement,\n\ttype ProcessElementContext,\n\tDynamicValue,\n} from \"html-validate\";\nimport { findSlotAttribute } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\texport interface MetaData {\n\t\tcomponent?: string;\n\t}\n}\n\nfunction isBound(node: HtmlElement): boolean {\n\treturn node.hasAttribute(\"v-html\");\n}\n\nfunction isSlot(node: HtmlElement): boolean {\n\treturn node.is(\"slot\");\n}\n\nfunction loadSlotMeta(context: ProcessElementContext, slotname: string, node: HtmlElement): void {\n\tconst parent = node.parent;\n\tif (!parent) {\n\t\treturn;\n\t}\n\n\t/* Generate a new virtual tagname to load meta element from */\n\tconst getMetaFor = (tagName: string): MetaElement | null => {\n\t\tconst meta = context.getMetaFor(tagName);\n\t\treturn meta && meta.tagName !== \"*\" ? meta : null;\n\t};\n\tconst key = `${parent.tagName}#${slotname}`;\n\tconst fallbackKey = `${parent.tagName}:${slotname}`;\n\tconst meta = getMetaFor(key) ?? getMetaFor(fallbackKey);\n\tif (!meta) {\n\t\treturn;\n\t}\n\n\tnode.loadMeta(meta);\n\n\t/* add an annotation so error messages will be more understandable */\n\tnode.setAnnotation(`slot \"${slotname}\" (<${parent.tagName}>)`);\n}\n\n/**\n * Handle <component> or a component with a slot wrapped in it.\n */\nfunction loadComponentMeta(\n\tcontext: ProcessElementContext,\n\tnode: HtmlElement,\n\tcomponent: string,\n): void {\n\tlet src: HtmlElement = node;\n\n\t/* if this is a slot with wrapped in a <component> we fetch attributes from\n\t * the parent element, i.e. the actual component */\n\tif (node.tagName === \"template\" && src.parent) {\n\t\tsrc = src.parent;\n\t}\n\n\t/* try to fetch the attribute containing the element to use */\n\tconst attr = src.getAttribute(component);\n\tif (!attr || attr.isDynamic) {\n\t\treturn;\n\t}\n\n\t/* use the attribute value to lookup new metadata based on the tagname */\n\tconst tagName = attr.value as string;\n\tconst meta = context.getMetaFor(tagName);\n\tif (!meta || meta.tagName === \"*\") {\n\t\treturn;\n\t}\n\n\tnode.loadMeta(meta);\n\n\t/* update or add new annotation so error messages will be more descriptive */\n\tif (node.isSameNode(src)) {\n\t\tnode.setAnnotation(`<${meta.tagName}> (<${node.tagName}>)`);\n\t} else {\n\t\tconst name = node.annotatedName.replace(\"(<\", `(<${meta.tagName}> via <`);\n\t\tnode.setAnnotation(name);\n\t}\n}\n\nexport function processElement(this: ProcessElementContext, node: HtmlElement): void {\n\tconst slot = findSlotAttribute(node);\n\n\t/* If this element is a slot we load new metadata properties onto the element\n\t * to support adding properties directly to slots, e.g. to allow/disallow\n\t * content in the slot. */\n\tif (slot) {\n\t\tconst [slotname] = slot;\n\t\tloadSlotMeta(this, slotname, node);\n\t}\n\n\t/* handle usage of <component>, either directly or inside a component */\n\tif (node.meta?.component) {\n\t\tloadComponentMeta(this, node, node.meta.component);\n\t}\n\n\t/* Since html-validate v9.5.4 `<template>` tags are generally ignored when\n\t * checking descendants but since v9.6.1 the checks are enabled if this flag\n\t * is disabled. This is a needed both for `<template #slot>` and when using\n\t * `<template>` inside a Vue SFC where the element is transparent instead of\n\t * acting as a `HTMLTemplateElement`. */\n\tif (node.is(\"template\") && node.meta) {\n\t\tnode.meta.templateRoot = false;\n\t}\n\n\t/* Mark as having dynamic text if the element either content bound via v-html\n\t * or if it is a slot. This is needed for rules with requires textual content,\n\t * e.g a heading cannot be empty. */\n\tif (isBound(node) || isSlot(node)) {\n\t\tnode.appendText(new DynamicValue(\"\"), node.location);\n\t}\n}\n", "import { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\n\n/**\n * Transform a regular HTML file. In practice this only applies hooks without\n * any extraction.\n */\nexport function* transformHTML(source: Source): Iterable<Source> {\n\tyield {\n\t\t...source,\n\t\thooks: {\n\t\t\tprocessAttribute,\n\t\t\tprocessElement,\n\t\t},\n\t};\n}\n\ntransformHTML.api = 1;\n", "import { TemplateExtractor } from \"@html-validate/plugin-utils\";\nimport { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\n\n/**\n * Match template property in `Vue.component` call\n */\nexport function transformJS(source: Source): Iterable<Source> {\n\tconst te = TemplateExtractor.fromString(source.data, source.filename);\n\treturn Array.from(te.extractObjectProperty(\"template\"), (cur) => {\n\t\tcur.originalData = source.originalData ?? source.data;\n\t\tcur.hooks = {\n\t\t\tprocessAttribute,\n\t\t\tprocessElement,\n\t\t};\n\t\treturn cur;\n\t});\n}\n\ntransformJS.api = 1;\n", "import { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\nimport { stripTemplating } from \"../utils\";\n\nfunction findLocation(source: string, index: number, preamble: number): [number, number] {\n\tlet line = 1;\n\tlet prev = 0;\n\tlet pos = source.indexOf(\"\\n\");\n\twhile (pos !== -1) {\n\t\tif (pos > index) {\n\t\t\treturn [line, index - prev + preamble + 1];\n\t\t}\n\t\tline++;\n\t\tprev = pos;\n\t\tpos = source.indexOf(\"\\n\", pos + 1);\n\t}\n\treturn [line, 1];\n}\n\nfunction computeIndent(text: string): string {\n\tconst lines = text.split(\"\\n\");\n\tconst initial = null as string | null;\n\tconst common = lines.reduce((common, line) => {\n\t\tconst match = /^(\\s*)\\S/.exec(line);\n\t\tif (match) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if match matches [1] will exist */\n\t\t\tconst indent = match[1]!;\n\t\t\treturn common === null || indent.length < common.length ? indent : common;\n\t\t} else {\n\t\t\treturn common;\n\t\t}\n\t}, initial);\n\treturn common ?? \"\";\n}\n\n/**\n * Match templates from SFC <template> tag\n */\nexport function* transformSFC(source: Source): Iterable<Source> {\n\tconst indent = computeIndent(source.data);\n\t/* eslint-disable-next-line security/detect-non-literal-regexp -- will only contain whitespace */\n\tconst sfc = new RegExp(`^${indent}(<template([^>]*)>)([^]*?)^${indent}(</template>)`, \"gm\");\n\tlet match: RegExpExecArray | null;\n\twhile ((match = sfc.exec(source.data)) !== null) {\n\t\tconst attr = match[2] ?? \"\";\n\t\tconst data = `${match[1]!}${match[3]!}${match[4]!}`; // eslint-disable-line @typescript-eslint/no-non-null-assertion -- groups exists when regex matches\n\t\tif (!/lang=\".*?\"/.exec(attr)) {\n\t\t\tconst [line, column] = findLocation(source.data, match.index, 0);\n\t\t\tyield {\n\t\t\t\tdata: stripTemplating(data),\n\t\t\t\tfilename: source.filename,\n\t\t\t\tline: line + (source.line - 1),\n\t\t\t\tcolumn: column + (source.column - 1),\n\t\t\t\toffset: match.index + source.offset,\n\t\t\t\toriginalData: source.originalData ?? source.data,\n\t\t\t\thooks: {\n\t\t\t\t\tprocessAttribute,\n\t\t\t\t\tprocessElement,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n}\n\ntransformSFC.api = 1;\n", "import { type Source } from \"html-validate\";\nimport { transformHTML } from \"./html.transform\";\nimport { transformJS } from \"./js.transform\";\nimport { transformSFC } from \"./sfc.transform\";\n\n/**\n * Returns true if the source is considered a SFC component\n */\nfunction isVue(source: Source): boolean {\n\treturn !!/\\.vue$/i.exec(source.filename);\n}\n\n/**\n * Returns true if the source is considered javascript\n */\nfunction isJavascript(source: Source): boolean {\n\treturn !!/\\.(jsx?|tsx?)$/i.exec(source.filename);\n}\n\nexport function* autodetect(source: Source): Iterable<Source> {\n\tif (isVue(source)) {\n\t\tyield* transformSFC(source);\n\t} else if (isJavascript(source)) {\n\t\tyield* transformJS(source);\n\t} else {\n\t\tyield* transformHTML(source);\n\t}\n}\n\nautodetect.api = 1;\n", "import { type Transformer } from \"html-validate\";\nimport { autodetect } from \"./auto.transform\";\nimport { transformHTML } from \"./html.transform\";\nimport { transformJS } from \"./js.transform\";\nimport { transformSFC } from \"./sfc.transform\";\n\nconst transformer: Record<string, Transformer> = {\n\tdefault: autodetect,\n\tauto: autodetect,\n\tjs: transformJS,\n\tsfc: transformSFC,\n\thtml: transformHTML,\n};\n\nexport default transformer;\n", "/* istanbul ignore file */\n\nimport plugin from \"./index\";\n\nexport = plugin;\n"],
5
- "mappings": "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",
6
- "names": ["import_html_validate", "import_html_validate", "import_html_validate", "import_html_validate", "difference", "import_html_validate", "import_html_validate", "meta", "name", "common"]
3
+ "sources": ["../../src/index.ts", "../../package.json", "../../src/elements.ts", "../../src/configs/recommended.ts", "../../src/configs/index.ts", "../../src/rules/available-slots.ts", "../../src/utils/strip-templating.ts", "../../src/utils/slots.ts", "../../src/rules/deprecated-slot.ts", "../../src/rules/prefer-slot-shorthand.ts", "../../src/rules/required-slots.ts", "../../src/rules/index.ts", "../../src/schema.json", "../../src/hooks/attribute.ts", "../../src/hooks/element.ts", "../../src/transform/html.transform.ts", "../../src/transform/js.transform.ts", "../../src/transform/sfc.transform.ts", "../../src/transform/auto.transform.ts", "../../src/transform/index.ts", "../../src/entry-cjs.ts"],
4
+ "sourcesContent": ["import { type Plugin, compatibilityCheck } from \"html-validate\";\nimport { name, peerDependencies } from \"../package.json\";\nimport configs from \"./configs\";\nimport rules from \"./rules\";\nimport elementSchema from \"./schema.json\";\nimport transformer from \"./transform\";\n\nconst range = peerDependencies[\"html-validate\"];\ncompatibilityCheck(name, range);\n\nconst plugin: Plugin = {\n\tname,\n\tconfigs,\n\trules,\n\ttransformer,\n\telementSchema,\n};\n\nexport default plugin;\n", "{\n \"name\": \"html-validate-vue\",\n \"version\": \"7.4.0\",\n \"description\": \"vue transform for html-validate\",\n \"keywords\": [\n \"html\",\n \"lint\",\n \"html-validate\",\n \"vue\"\n ],\n \"homepage\": \"https://html-validate.org/frameworks/vue.html\",\n \"bugs\": {\n \"url\": \"https://gitlab.com/html-validate/html-validate-vue/issues/new\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://gitlab.com/html-validate/html-validate-vue.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"David Sveningsson <ext@sidvind.com>\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/esm/index.d.mts\",\n \"default\": \"./dist/esm/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/cjs/index.d.cts\",\n \"default\": \"./dist/cjs/index.cjs\"\n }\n }\n },\n \"main\": \"dist/cjs/index.cjs\",\n \"module\": \"dist/esm/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"prebuild\": \"tsc\",\n \"build\": \"run-s build:*\",\n \"build:lib\": \"node build.mjs\",\n \"build:cjs\": \"dts-bundle-generator --no-banner --project tsconfig.cjs.json -o dist/cjs/index.d.cts src/entry-cjs.ts\",\n \"build:esm\": \"dts-bundle-generator --no-banner --project tsconfig.esm.json -o dist/esm/index.d.mts src/entry-esm.ts\",\n \"eslint\": \"eslint --cache .\",\n \"eslint:fix\": \"eslint --cache --fix .\",\n \"prepack\": \"release-prepack package.json --bundle\",\n \"postpack\": \"release-postpack package.json\",\n \"prepare\": \"husky\",\n \"prepublishOnly\": \"release-prepack package.json --bundle\",\n \"prettier:check\": \"prettier --check .\",\n \"prettier:write\": \"prettier --write .\",\n \"postpublish\": \"release-postpack package.json\",\n \"attw\": \"attw --no-emoji --pack .\",\n \"test\": \"jest\"\n },\n \"commitlint\": {\n \"extends\": \"@html-validate\"\n },\n \"prettier\": \"@html-validate/prettier-config\",\n \"release\": {\n \"extends\": \"@html-validate/semantic-release-config\"\n },\n \"jest\": {\n \"preset\": \"@html-validate/jest-config\"\n },\n \"dependencies\": {\n \"@html-validate/plugin-utils\": \"2.2.0\",\n \"semver\": \"7.7.3\"\n },\n \"devDependencies\": {\n \"@arethetypeswrong/cli\": \"0.18.2\",\n \"@html-validate/commitlint-config\": \"3.6.1\",\n \"@html-validate/eslint-config\": \"6.10.5\",\n \"@html-validate/eslint-config-jest\": \"6.10.5\",\n \"@html-validate/eslint-config-typescript\": \"6.10.5\",\n \"@html-validate/eslint-config-typescript-typeinfo\": \"6.10.5\",\n \"@html-validate/jest-config\": \"3.13.0\",\n \"@html-validate/prettier-config\": \"3.1.6\",\n \"@html-validate/release-scripts\": \"7.1.0\",\n \"@tsconfig/node18\": \"18.2.6\",\n \"@tsconfig/strictest\": \"2.0.8\",\n \"@types/estree\": \"1.0.8\",\n \"@types/jest\": \"30.0.0\",\n \"@types/node\": \"18.19.130\",\n \"@types/semver\": \"7.7.1\",\n \"dts-bundle-generator\": \"9.5.1\",\n \"esbuild\": \"0.27.0\",\n \"html-validate\": \"10.4.0\",\n \"husky\": \"9.1.7\",\n \"jest\": \"30.2.0\",\n \"jest-environment-jsdom\": \"30.2.0\",\n \"npm-pkg-lint\": \"4.3.1\",\n \"npm-run-all2\": \"8.0.4\",\n \"ts-jest\": \"29.4.5\",\n \"typescript\": \"5.9.3\"\n },\n \"peerDependencies\": {\n \"html-validate\": \"^8.21.0 || ^9.0.0 || ^10.0.0\"\n },\n \"engines\": {\n \"node\": \">= 18.0\"\n },\n \"externalDependencies\": [\n \"@html-validate/plugin-utils\"\n ]\n}\n", "import { defineMetadata } from \"html-validate\";\n\nexport default defineMetadata({\n\tcomponent: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tcomponent: \"is\",\n\t\trequiredAttributes: [\"is\"],\n\t},\n\n\t\"keep-alive\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\tportal: {\n\t\tdeprecated: {\n\t\t\tsource: \"vue\",\n\t\t\tmessage: \"the <portal> element has been renamed to <teleport>\",\n\t\t\tdocumentation: \"The `<portal>` element has been renamed to `<teleport>`\",\n\t\t},\n\t},\n\n\t\"router-link\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\t\"router-view\": {\n\t\tflow: true,\n\t\tslots: [\"default\"],\n\t},\n\n\tslot: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tscriptSupporting: true,\n\t},\n\n\tsuspense: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tslots: [\"default\", \"fallback\"],\n\t},\n\n\tteleport: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t},\n\n\ttransition: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\t\"transition-group\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tcomponent: \"tag\",\n\t},\n});\n", "import { type ConfigData } from \"html-validate\";\nimport vueElements from \"../elements\";\n\nexport function createConfig(): ConfigData {\n\tconst config: ConfigData = {\n\t\telements: [vueElements],\n\t\trules: {\n\t\t\t/* vue modifiers often use camelcase so allow by default */\n\t\t\t\"attr-case\": [\"error\", { style: \"camelcase\" }],\n\n\t\t\t/* self closing tags often used in vue code so allow by default*/\n\t\t\t\"void-style\": [\"error\", { style: \"selfclose\" }],\n\t\t\t\"no-self-closing\": \"off\",\n\n\t\t\t/* enable rules from this plugin */\n\t\t\t\"vue/available-slots\": \"error\",\n\t\t\t\"vue/prefer-slot-shorthand\": \"error\",\n\t\t\t\"vue/required-slots\": \"error\",\n\t\t},\n\t};\n\n\treturn config;\n}\n\nexport default createConfig();\n", "import recommended from \"./recommended\";\n\nexport default {\n\trecommended,\n};\n", "import {\n\ttype DOMReadyEvent,\n\ttype HtmlElement,\n\ttype RuleDocumentation,\n\tRule,\n\twalk,\n} from \"html-validate\";\nimport { findUsedSlots } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\tinterface MetaData {\n\t\tslots?: string[];\n\t}\n\tinterface MetaElement {\n\t\tslots?: string[];\n\t}\n}\n\ninterface Context {\n\telement: string;\n\tslot: string;\n\tavailable: string[];\n}\n\nfunction difference<T>(a: Set<T>, b: Set<T>): Set<T> {\n\tconst result = new Set(a);\n\tfor (const elem of b) {\n\t\tresult.delete(elem);\n\t}\n\treturn result;\n}\n\nexport class AvailableSlots extends Rule<Context> {\n\tpublic override documentation(context?: Context): RuleDocumentation {\n\t\tif (context) {\n\t\t\treturn {\n\t\t\t\tdescription: [\n\t\t\t\t\t`The <${context.element}> component does not have a slot named \"${context.slot}\". Only known slots can be specified.`,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"The following slots are available\",\n\t\t\t\t]\n\t\t\t\t\t.concat(context.available.map((slot) => `- ${slot}`))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdescription: \"Only known slots can be specified.\",\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"dom:ready\", (event: DOMReadyEvent) => {\n\t\t\tconst doc = event.document;\n\t\t\twalk.depthFirst(doc, (node: HtmlElement) => {\n\t\t\t\t/* ignore rule if element has no meta or meta does not specify available slots */\n\t\t\t\tconst meta = node.meta;\n\t\t\t\tif (!meta?.slots) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.validateSlots(node, meta.slots);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate validateSlots(node: HtmlElement, slots: string[]): void {\n\t\tconst usedSlots = findUsedSlots(node);\n\t\tconst available = new Set(slots);\n\t\tconst used = new Set(usedSlots.keys());\n\t\tconst diff = difference(used, available);\n\n\t\tfor (const missing of diff) {\n\t\t\tconst context: Context = {\n\t\t\t\telement: node.tagName,\n\t\t\t\tslot: missing,\n\t\t\t\tavailable: slots,\n\t\t\t};\n\t\t\tthis.report(\n\t\t\t\tnode,\n\t\t\t\t`<${node.tagName}> component has no slot \"${missing}\"`,\n\t\t\t\tusedSlots.get(missing),\n\t\t\t\tcontext,\n\t\t\t);\n\t\t}\n\t}\n}\n", "/**\n * Strip anything inside `{{ .. }}` in case it contains anything that looks like\n * markup, i.e. it will be ignored\n */\nexport function stripTemplating(str: string): string {\n\t/* eslint-disable-next-line sonarjs/slow-regex -- technical debt, should refactor */\n\treturn str.replace(/{{(.*?)}}/g, (_, m: string) => {\n\t\tconst filler = \" \".repeat(m.length);\n\t\treturn `{{${filler}}}`;\n\t});\n}\n", "import { type HtmlElement, type Location } from \"html-validate\";\n\nconst slotAttr = /(?:v-slot:|#)([^[]+)/;\n\nfunction haveSlot(value: [string, Location] | null): value is [string, Location] {\n\treturn value !== null;\n}\n\n/**\n * Search all children for slots and return both slot names and locations.\n */\nexport function findUsedSlots(node: HtmlElement): Map<string, Location> {\n\tconst template = node.querySelectorAll(\">template, >[slot]\");\n\tconst slots = template.map((child) => findSlotAttribute(child)).filter(haveSlot);\n\tconst initial = new Map<string, Location>();\n\treturn slots.reduce((result: Map<string, Location>, [key, val]) => {\n\t\tresult.set(key, val);\n\t\treturn result;\n\t}, initial);\n}\n\n/**\n * Find the name of the slot and its location used by an element. Searches\n * both v-slot:foo and slot=\"foo\".\n */\nexport function findSlotAttribute(node: HtmlElement): [string, Location] | null {\n\tfor (const attr of node.attributes) {\n\t\t/* find v-slot directive */\n\t\tconst match = slotAttr.exec(attr.key);\n\t\tif (match) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if slot matches [1] will exist */\n\t\t\tconst slot = match[1]!;\n\t\t\treturn [slot, attr.keyLocation];\n\t\t}\n\n\t\t/* find deprecated slot attribute */\n\t\tif (attr.key === \"slot\" && typeof attr.value === \"string\") {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- valueLocation will always be set the value is present */\n\t\t\treturn [attr.value, attr.valueLocation!];\n\t\t}\n\t}\n\treturn null;\n}\n", "import {\n\ttype DOMReadyEvent,\n\ttype HtmlElement,\n\ttype RuleDocumentation,\n\tRule,\n\twalk,\n} from \"html-validate\";\nimport { findUsedSlots } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\tinterface MetaData {\n\t\tdeprecatedSlots?: Record<string, boolean | string>;\n\t}\n\tinterface MetaElement {\n\t\trequiredSlots?: string[];\n\t\tdeprecatedSlots?: Record<string, boolean | string>;\n\t}\n}\n\n/** @internal */\nexport interface RuleContext {\n\telement: string;\n\tslot: string;\n\tinfo: string | null;\n}\n\nexport class DeprecatedSlot extends Rule<RuleContext> {\n\tpublic override documentation(context?: RuleContext): RuleDocumentation {\n\t\tif (context) {\n\t\t\tconst preamble = `The slot \\`${context.slot}\\` is deprecated and must not be used`;\n\t\t\treturn {\n\t\t\t\tdescription: context.info ? `${preamble}: ${context.info}.` : `${preamble}.`,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdescription: \"This slot is deprecated and must not be used.\",\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"dom:ready\", (event: DOMReadyEvent) => {\n\t\t\tconst doc = event.document;\n\t\t\twalk.depthFirst(doc, (node: HtmlElement) => {\n\t\t\t\t/* ignore rule if element has no meta or meta does not specify deprecated slots */\n\t\t\t\tconst deprecatedSlots = node.meta?.deprecatedSlots;\n\t\t\t\tif (!deprecatedSlots) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.validateSlots(node, deprecatedSlots);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate validateSlots(\n\t\tnode: HtmlElement,\n\t\tdeprecatedSlots: Record<string, boolean | string>,\n\t): void {\n\t\tconst slots = findUsedSlots(node);\n\t\tfor (const [slot, location] of slots.entries()) {\n\t\t\tconst deprecated = deprecatedSlots[slot];\n\t\t\tif (!deprecated) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst context: RuleContext = {\n\t\t\t\telement: node.tagName,\n\t\t\t\tslot,\n\t\t\t\tinfo: typeof deprecated === \"string\" ? deprecated : null,\n\t\t\t};\n\t\t\tconst preamble = `slot \"${slot}\" is deprecated`;\n\t\t\tconst message = typeof deprecated === \"string\" ? `${preamble}: ${deprecated}` : preamble;\n\t\t\tthis.report({\n\t\t\t\tnode,\n\t\t\t\tmessage,\n\t\t\t\tlocation,\n\t\t\t\tcontext,\n\t\t\t});\n\t\t}\n\t}\n}\n", "import { type AttributeEvent, type RuleDocumentation, DynamicValue, Rule } from \"html-validate\";\n\ninterface RuleContext {\n\tslot: string;\n}\n\nconst prefix = \"v-slot:\";\n\nfunction isVSlot(attr: string): string | null {\n\tif (!attr.startsWith(prefix)) {\n\t\treturn null;\n\t}\n\tif (attr.length <= prefix.length) {\n\t\treturn null;\n\t}\n\tconst slot = attr.slice(prefix.length);\n\tif (/^\\[.*\\]$/.exec(slot)) {\n\t\treturn null;\n\t}\n\treturn slot;\n}\n\nfunction isDeprecatedSlot(attr: string, value: null | string | DynamicValue): string | null {\n\tif (attr !== \"slot\") {\n\t\treturn null;\n\t}\n\tif (value instanceof DynamicValue) {\n\t\treturn null;\n\t}\n\tif (value === null || value === \"\") {\n\t\treturn null;\n\t}\n\treturn value;\n}\n\nexport class PreferSlotShorthand extends Rule<RuleContext> {\n\tpublic override documentation(context?: RuleContext): RuleDocumentation {\n\t\tconst slot = context?.slot ?? \"my-slot\";\n\t\treturn {\n\t\t\tdescription: [\n\t\t\t\t`Prefer to use \\`#${slot}\\` over \\`v-slot:${slot}\\`.`,\n\t\t\t\t\"\",\n\t\t\t\t\"Vue.js supports a shorthand syntax for slots using `#` instead of `v-slot:` or the deprecated `slot` attribute, e.g. using `#header` instead of `v-slot:header`.\",\n\t\t\t].join(\"\\n\"),\n\t\t};\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"attr\", (event: AttributeEvent) => {\n\t\t\tconst { key: attr, value, target, keyLocation: location } = event;\n\n\t\t\tlet slot: string | null;\n\n\t\t\t/* handle v-slot:xyz */\n\t\t\tslot = isVSlot(attr);\n\t\t\tif (slot) {\n\t\t\t\tconst context: RuleContext = { slot };\n\t\t\t\tconst message = `Prefer to use #${slot} over ${attr}`;\n\t\t\t\tthis.report(target, message, location, context);\n\t\t\t}\n\n\t\t\t/* handle slot=\"xyz\" */\n\t\t\tslot = isDeprecatedSlot(attr, value);\n\t\t\tif (slot) {\n\t\t\t\tconst context: RuleContext = { slot };\n\t\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- value is checked by isDeprecatedSlot */\n\t\t\t\tconst message = `Prefer to use #${slot} over ${attr}=\"${value!.toString()}\"`;\n\t\t\t\tthis.report(target, message, location, context);\n\t\t\t}\n\t\t});\n\t}\n}\n", "import {\n\ttype DOMReadyEvent,\n\ttype HtmlElement,\n\ttype RuleDocumentation,\n\tRule,\n\twalk,\n} from \"html-validate\";\nimport { findUsedSlots } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\tinterface MetaData {\n\t\trequiredSlots?: string[];\n\t}\n\tinterface MetaElement {\n\t\trequiredSlots?: string[];\n\t}\n}\n\ninterface Context {\n\telement: string;\n\tslot: string;\n\trequired: string[];\n}\n\nfunction difference<T>(a: Set<T>, b: Set<T>): Set<T> {\n\tconst result = new Set(a);\n\tfor (const elem of b) {\n\t\tresult.delete(elem);\n\t}\n\treturn result;\n}\n\nexport class RequiredSlots extends Rule<Context> {\n\tpublic override documentation(context?: Context): RuleDocumentation {\n\t\tif (context) {\n\t\t\treturn {\n\t\t\t\tdescription: [\n\t\t\t\t\t`The <${context.element}> component requires slot \"${context.slot}\" to be implemented. Add \\`<template v-slot:${context.slot}>\\``,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"The following slots are required\",\n\t\t\t\t]\n\t\t\t\t\t.concat(context.required.map((slot) => `- ${slot}`))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdescription: \"All required slots must be implemented.\",\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"dom:ready\", (event: DOMReadyEvent) => {\n\t\t\tconst doc = event.document;\n\t\t\twalk.depthFirst(doc, (node: HtmlElement) => {\n\t\t\t\t/* ignore rule if element has no meta or meta does not specify available slots */\n\t\t\t\tconst meta = node.meta;\n\t\t\t\tif (!meta?.requiredSlots) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.validateSlots(node, meta.requiredSlots);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate validateSlots(node: HtmlElement, requiredSlots: string[]): void {\n\t\tconst usedSlots = findUsedSlots(node);\n\t\tconst required = new Set(requiredSlots);\n\t\tconst used = new Set(usedSlots.keys());\n\t\tconst diff = difference(required, used);\n\n\t\tfor (const missing of diff) {\n\t\t\tconst context: Context = {\n\t\t\t\telement: node.tagName,\n\t\t\t\tslot: missing,\n\t\t\t\trequired: requiredSlots,\n\t\t\t};\n\t\t\tthis.report(\n\t\t\t\tnode,\n\t\t\t\t`<${node.tagName}> component requires slot \"${missing}\" to be implemented`,\n\t\t\t\tnull,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t}\n\t}\n}\n", "import { AvailableSlots } from \"./available-slots\";\nimport { DeprecatedSlot } from \"./deprecated-slot\";\nimport { PreferSlotShorthand } from \"./prefer-slot-shorthand\";\nimport { RequiredSlots } from \"./required-slots\";\n\nconst rules = {\n\t\"vue/available-slots\": AvailableSlots,\n\t\"vue/deprecated-slot\": DeprecatedSlot,\n\t\"vue/prefer-slot-shorthand\": PreferSlotShorthand,\n\t\"vue/required-slots\": RequiredSlots,\n};\n\nexport default rules;\n", "{\n \"properties\": {\n \"component\": {\n \"type\": \"string\",\n \"copyable\": true\n },\n \"deprecatedSlots\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \".*\": {\n \"anyOf\": [{ \"type\": \"boolean\" }, { \"type\": \"string\" }]\n }\n }\n },\n \"requiredSlots\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"slots\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n}\n", "import { type AttributeData, DynamicValue } from \"html-validate\";\n\nexport function* processAttribute(attr: AttributeData): Iterable<AttributeData> {\n\t/* always yield original attribute */\n\tyield attr;\n\n\t/* setup :foo and v-bind:foo alias */\n\tconst bind = /^(?:v-bind)?:(.*)$/.exec(attr.key);\n\tif (bind) {\n\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if bind matches [1] will exist */\n\t\tconst key = bind[1]!;\n\t\tyield {\n\t\t\t...attr,\n\t\t\tkey,\n\t\t\tvalue: new DynamicValue(attr.value ? String(attr.value) : \"\"),\n\t\t\toriginalAttribute: attr.key,\n\t\t};\n\t}\n}\n", "import {\n\ttype HtmlElement,\n\ttype MetaElement,\n\ttype ProcessElementContext,\n\tDynamicValue,\n} from \"html-validate\";\nimport { findSlotAttribute } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\texport interface MetaData {\n\t\tcomponent?: string;\n\t}\n}\n\nfunction isBound(node: HtmlElement): boolean {\n\treturn node.hasAttribute(\"v-html\");\n}\n\nfunction isSlot(node: HtmlElement): boolean {\n\treturn node.is(\"slot\");\n}\n\nfunction loadSlotMeta(context: ProcessElementContext, slotname: string, node: HtmlElement): void {\n\tconst parent = node.parent;\n\tif (!parent) {\n\t\treturn;\n\t}\n\n\t/* Generate a new virtual tagname to load meta element from */\n\tconst getMetaFor = (tagName: string): MetaElement | null => {\n\t\tconst meta = context.getMetaFor(tagName);\n\t\treturn meta && meta.tagName !== \"*\" ? meta : null;\n\t};\n\tconst key = `${parent.tagName}#${slotname}`;\n\tconst fallbackKey = `${parent.tagName}:${slotname}`;\n\tconst meta = getMetaFor(key) ?? getMetaFor(fallbackKey);\n\tif (!meta) {\n\t\treturn;\n\t}\n\n\tnode.loadMeta(meta);\n\n\t/* add an annotation so error messages will be more understandable */\n\tnode.setAnnotation(`slot \"${slotname}\" (<${parent.tagName}>)`);\n}\n\n/**\n * Handle <component> or a component with a slot wrapped in it.\n */\nfunction loadComponentMeta(\n\tcontext: ProcessElementContext,\n\tnode: HtmlElement,\n\tcomponent: string,\n): void {\n\tlet src: HtmlElement = node;\n\n\t/* if this is a slot with wrapped in a <component> we fetch attributes from\n\t * the parent element, i.e. the actual component */\n\tif (node.tagName === \"template\" && src.parent) {\n\t\tsrc = src.parent;\n\t}\n\n\t/* try to fetch the attribute containing the element to use */\n\tconst attr = src.getAttribute(component);\n\tif (!attr || attr.isDynamic) {\n\t\treturn;\n\t}\n\n\t/* use the attribute value to lookup new metadata based on the tagname */\n\tconst tagName = attr.value as string;\n\tconst meta = context.getMetaFor(tagName);\n\tif (!meta || meta.tagName === \"*\") {\n\t\treturn;\n\t}\n\n\tnode.loadMeta(meta);\n\n\t/* update or add new annotation so error messages will be more descriptive */\n\tif (node.isSameNode(src)) {\n\t\tnode.setAnnotation(`<${meta.tagName}> (<${node.tagName}>)`);\n\t} else {\n\t\tconst name = node.annotatedName.replace(\"(<\", `(<${meta.tagName}> via <`);\n\t\tnode.setAnnotation(name);\n\t}\n}\n\nexport function processElement(this: ProcessElementContext, node: HtmlElement): void {\n\tconst slot = findSlotAttribute(node);\n\n\t/* If this element is a slot we load new metadata properties onto the element\n\t * to support adding properties directly to slots, e.g. to allow/disallow\n\t * content in the slot. */\n\tif (slot) {\n\t\tconst [slotname] = slot;\n\t\tloadSlotMeta(this, slotname, node);\n\t}\n\n\t/* handle usage of <component>, either directly or inside a component */\n\tif (node.meta?.component) {\n\t\tloadComponentMeta(this, node, node.meta.component);\n\t}\n\n\t/* Since html-validate v9.5.4 `<template>` tags are generally ignored when\n\t * checking descendants but since v9.6.1 the checks are enabled if this flag\n\t * is disabled. This is a needed both for `<template #slot>` and when using\n\t * `<template>` inside a Vue SFC where the element is transparent instead of\n\t * acting as a `HTMLTemplateElement`. */\n\tif (node.is(\"template\") && node.meta) {\n\t\tnode.meta.templateRoot = false;\n\t}\n\n\t/* Mark as having dynamic text if the element either content bound via v-html\n\t * or if it is a slot. This is needed for rules with requires textual content,\n\t * e.g a heading cannot be empty. */\n\tif (isBound(node) || isSlot(node)) {\n\t\tnode.appendText(new DynamicValue(\"\"), node.location);\n\t}\n}\n", "import { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\n\n/**\n * Transform a regular HTML file. In practice this only applies hooks without\n * any extraction.\n */\nexport function* transformHTML(source: Source): Iterable<Source> {\n\tyield {\n\t\t...source,\n\t\thooks: {\n\t\t\tprocessAttribute,\n\t\t\tprocessElement,\n\t\t},\n\t};\n}\n\ntransformHTML.api = 1;\n", "import { TemplateExtractor } from \"@html-validate/plugin-utils\";\nimport { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\n\n/**\n * Match template property in `Vue.component` call\n */\nexport function transformJS(source: Source): Iterable<Source> {\n\tconst te = TemplateExtractor.fromString(source.data, source.filename);\n\treturn Array.from(te.extractObjectProperty(\"template\"), (cur) => {\n\t\tcur.originalData = source.originalData ?? source.data;\n\t\tcur.hooks = {\n\t\t\tprocessAttribute,\n\t\t\tprocessElement,\n\t\t};\n\t\treturn cur;\n\t});\n}\n\ntransformJS.api = 1;\n", "import { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\nimport { stripTemplating } from \"../utils\";\n\nfunction findLocation(source: string, index: number, preamble: number): [number, number] {\n\tlet line = 1;\n\tlet prev = 0;\n\tlet pos = source.indexOf(\"\\n\");\n\twhile (pos !== -1) {\n\t\tif (pos > index) {\n\t\t\treturn [line, index - prev + preamble + 1];\n\t\t}\n\t\tline++;\n\t\tprev = pos;\n\t\tpos = source.indexOf(\"\\n\", pos + 1);\n\t}\n\treturn [line, 1];\n}\n\nfunction computeIndent(text: string): string {\n\tconst lines = text.split(\"\\n\");\n\tconst initial = null as string | null;\n\tconst common = lines.reduce((common, line) => {\n\t\tconst match = /^(\\s*)\\S/.exec(line);\n\t\tif (match) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if match matches [1] will exist */\n\t\t\tconst indent = match[1]!;\n\t\t\treturn common === null || indent.length < common.length ? indent : common;\n\t\t} else {\n\t\t\treturn common;\n\t\t}\n\t}, initial);\n\treturn common ?? \"\";\n}\n\n/**\n * Match templates from SFC <template> tag\n */\nexport function* transformSFC(source: Source): Iterable<Source> {\n\tconst indent = computeIndent(source.data);\n\t/* eslint-disable-next-line security/detect-non-literal-regexp -- will only contain whitespace */\n\tconst sfc = new RegExp(`^${indent}(<template([^>]*)>)([^]*?)^${indent}(</template>)`, \"gm\");\n\tlet match: RegExpExecArray | null;\n\twhile ((match = sfc.exec(source.data)) !== null) {\n\t\tconst attr = match[2] ?? \"\";\n\t\tconst data = `${match[1]!}${match[3]!}${match[4]!}`; // eslint-disable-line @typescript-eslint/no-non-null-assertion -- groups exists when regex matches\n\t\tif (!/lang=\".*?\"/.exec(attr)) {\n\t\t\tconst [line, column] = findLocation(source.data, match.index, 0);\n\t\t\tyield {\n\t\t\t\tdata: stripTemplating(data),\n\t\t\t\tfilename: source.filename,\n\t\t\t\tline: line + (source.line - 1),\n\t\t\t\tcolumn: column + (source.column - 1),\n\t\t\t\toffset: match.index + source.offset,\n\t\t\t\toriginalData: source.originalData ?? source.data,\n\t\t\t\thooks: {\n\t\t\t\t\tprocessAttribute,\n\t\t\t\t\tprocessElement,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n}\n\ntransformSFC.api = 1;\n", "import { type Source } from \"html-validate\";\nimport { transformHTML } from \"./html.transform\";\nimport { transformJS } from \"./js.transform\";\nimport { transformSFC } from \"./sfc.transform\";\n\n/**\n * Returns true if the source is considered a SFC component\n */\nfunction isVue(source: Source): boolean {\n\treturn !!/\\.vue$/i.exec(source.filename);\n}\n\n/**\n * Returns true if the source is considered javascript\n */\nfunction isJavascript(source: Source): boolean {\n\treturn !!/\\.(jsx?|tsx?)$/i.exec(source.filename);\n}\n\nexport function* autodetect(source: Source): Iterable<Source> {\n\tif (isVue(source)) {\n\t\tyield* transformSFC(source);\n\t} else if (isJavascript(source)) {\n\t\tyield* transformJS(source);\n\t} else {\n\t\tyield* transformHTML(source);\n\t}\n}\n\nautodetect.api = 1;\n", "import { type Transformer } from \"html-validate\";\nimport { autodetect } from \"./auto.transform\";\nimport { transformHTML } from \"./html.transform\";\nimport { transformJS } from \"./js.transform\";\nimport { transformSFC } from \"./sfc.transform\";\n\nconst transformer: Record<string, Transformer> = {\n\tdefault: autodetect,\n\tauto: autodetect,\n\tjs: transformJS,\n\tsfc: transformSFC,\n\thtml: transformHTML,\n};\n\nexport default transformer;\n", "/* istanbul ignore file */\n\nimport plugin from \"./index\";\n\nexport = plugin;\n"],
5
+ "mappings": "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",
6
+ "names": ["import_html_validate", "import_html_validate", "import_html_validate", "import_html_validate", "import_html_validate", "difference", "import_html_validate", "import_html_validate", "meta", "name", "common"]
7
7
  }
@@ -4,7 +4,7 @@ import { compatibilityCheck } from "html-validate";
4
4
  // package.json
5
5
  var name = "html-validate-vue";
6
6
  var peerDependencies = {
7
- "html-validate": "^8.10.0 || ^9.0.0 || ^10.0.0"
7
+ "html-validate": "^8.21.0 || ^9.0.0 || ^10.0.0"
8
8
  };
9
9
 
10
10
  // src/elements.ts
@@ -93,7 +93,10 @@ var configs_default = {
93
93
  };
94
94
 
95
95
  // src/rules/available-slots.ts
96
- import { Rule } from "html-validate";
96
+ import {
97
+ Rule,
98
+ walk
99
+ } from "html-validate";
97
100
 
98
101
  // src/utils/strip-templating.ts
99
102
  function stripTemplating(str) {
@@ -158,7 +161,7 @@ var AvailableSlots = class extends Rule {
158
161
  setup() {
159
162
  this.on("dom:ready", (event) => {
160
163
  const doc = event.document;
161
- doc.visitDepthFirst((node) => {
164
+ walk.depthFirst(doc, (node) => {
162
165
  const meta = node.meta;
163
166
  if (!meta?.slots) {
164
167
  return;
@@ -188,8 +191,62 @@ var AvailableSlots = class extends Rule {
188
191
  }
189
192
  };
190
193
 
194
+ // src/rules/deprecated-slot.ts
195
+ import {
196
+ Rule as Rule2,
197
+ walk as walk2
198
+ } from "html-validate";
199
+ var DeprecatedSlot = class extends Rule2 {
200
+ documentation(context) {
201
+ if (context) {
202
+ const preamble = `The slot \`${context.slot}\` is deprecated and must not be used`;
203
+ return {
204
+ description: context.info ? `${preamble}: ${context.info}.` : `${preamble}.`
205
+ };
206
+ } else {
207
+ return {
208
+ description: "This slot is deprecated and must not be used."
209
+ };
210
+ }
211
+ }
212
+ setup() {
213
+ this.on("dom:ready", (event) => {
214
+ const doc = event.document;
215
+ walk2.depthFirst(doc, (node) => {
216
+ const deprecatedSlots = node.meta?.deprecatedSlots;
217
+ if (!deprecatedSlots) {
218
+ return;
219
+ }
220
+ this.validateSlots(node, deprecatedSlots);
221
+ });
222
+ });
223
+ }
224
+ validateSlots(node, deprecatedSlots) {
225
+ const slots = findUsedSlots(node);
226
+ for (const [slot, location] of slots.entries()) {
227
+ const deprecated = deprecatedSlots[slot];
228
+ if (!deprecated) {
229
+ continue;
230
+ }
231
+ const context = {
232
+ element: node.tagName,
233
+ slot,
234
+ info: typeof deprecated === "string" ? deprecated : null
235
+ };
236
+ const preamble = `slot "${slot}" is deprecated`;
237
+ const message = typeof deprecated === "string" ? `${preamble}: ${deprecated}` : preamble;
238
+ this.report({
239
+ node,
240
+ message,
241
+ location,
242
+ context
243
+ });
244
+ }
245
+ }
246
+ };
247
+
191
248
  // src/rules/prefer-slot-shorthand.ts
192
- import { DynamicValue, Rule as Rule2 } from "html-validate";
249
+ import { DynamicValue, Rule as Rule3 } from "html-validate";
193
250
  var prefix = "v-slot:";
194
251
  function isVSlot(attr) {
195
252
  if (!attr.startsWith(prefix)) {
@@ -216,7 +273,7 @@ function isDeprecatedSlot(attr, value) {
216
273
  }
217
274
  return value;
218
275
  }
219
- var PreferSlotShorthand = class extends Rule2 {
276
+ var PreferSlotShorthand = class extends Rule3 {
220
277
  documentation(context) {
221
278
  const slot = context?.slot ?? "my-slot";
222
279
  return {
@@ -248,7 +305,10 @@ var PreferSlotShorthand = class extends Rule2 {
248
305
  };
249
306
 
250
307
  // src/rules/required-slots.ts
251
- import { Rule as Rule3 } from "html-validate";
308
+ import {
309
+ Rule as Rule4,
310
+ walk as walk3
311
+ } from "html-validate";
252
312
  function difference2(a, b) {
253
313
  const result = new Set(a);
254
314
  for (const elem of b) {
@@ -256,7 +316,7 @@ function difference2(a, b) {
256
316
  }
257
317
  return result;
258
318
  }
259
- var RequiredSlots = class extends Rule3 {
319
+ var RequiredSlots = class extends Rule4 {
260
320
  documentation(context) {
261
321
  if (context) {
262
322
  return {
@@ -275,7 +335,7 @@ var RequiredSlots = class extends Rule3 {
275
335
  setup() {
276
336
  this.on("dom:ready", (event) => {
277
337
  const doc = event.document;
278
- doc.visitDepthFirst((node) => {
338
+ walk3.depthFirst(doc, (node) => {
279
339
  const meta = node.meta;
280
340
  if (!meta?.requiredSlots) {
281
341
  return;
@@ -308,6 +368,7 @@ var RequiredSlots = class extends Rule3 {
308
368
  // src/rules/index.ts
309
369
  var rules = {
310
370
  "vue/available-slots": AvailableSlots,
371
+ "vue/deprecated-slot": DeprecatedSlot,
311
372
  "vue/prefer-slot-shorthand": PreferSlotShorthand,
312
373
  "vue/required-slots": RequiredSlots
313
374
  };
@@ -320,6 +381,14 @@ var schema_default = {
320
381
  type: "string",
321
382
  copyable: true
322
383
  },
384
+ deprecatedSlots: {
385
+ type: "object",
386
+ patternProperties: {
387
+ ".*": {
388
+ anyOf: [{ type: "boolean" }, { type: "string" }]
389
+ }
390
+ }
391
+ },
323
392
  requiredSlots: {
324
393
  type: "array",
325
394
  items: {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/index.ts", "../../package.json", "../../src/elements.ts", "../../src/configs/recommended.ts", "../../src/configs/index.ts", "../../src/rules/available-slots.ts", "../../src/utils/strip-templating.ts", "../../src/utils/slots.ts", "../../src/rules/prefer-slot-shorthand.ts", "../../src/rules/required-slots.ts", "../../src/rules/index.ts", "../../src/schema.json", "../../src/hooks/attribute.ts", "../../src/hooks/element.ts", "../../src/transform/html.transform.ts", "../../src/transform/js.transform.ts", "../../src/transform/sfc.transform.ts", "../../src/transform/auto.transform.ts", "../../src/transform/index.ts", "../../src/entry-esm.ts"],
4
- "sourcesContent": ["import { type Plugin, compatibilityCheck } from \"html-validate\";\nimport { name, peerDependencies } from \"../package.json\";\nimport configs from \"./configs\";\nimport rules from \"./rules\";\nimport elementSchema from \"./schema.json\";\nimport transformer from \"./transform\";\n\nconst range = peerDependencies[\"html-validate\"];\ncompatibilityCheck(name, range);\n\nconst plugin: Plugin = {\n\tname,\n\tconfigs,\n\trules,\n\ttransformer,\n\telementSchema,\n};\n\nexport default plugin;\n", "{\n \"name\": \"html-validate-vue\",\n \"version\": \"7.3.0\",\n \"description\": \"vue transform for html-validate\",\n \"keywords\": [\n \"html\",\n \"lint\",\n \"html-validate\",\n \"vue\"\n ],\n \"homepage\": \"https://html-validate.org/frameworks/vue.html\",\n \"bugs\": {\n \"url\": \"https://gitlab.com/html-validate/html-validate-vue/issues/new\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://gitlab.com/html-validate/html-validate-vue.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"David Sveningsson <ext@sidvind.com>\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/esm/index.d.mts\",\n \"default\": \"./dist/esm/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/cjs/index.d.cts\",\n \"default\": \"./dist/cjs/index.cjs\"\n }\n }\n },\n \"main\": \"dist/cjs/index.cjs\",\n \"module\": \"dist/esm/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"prebuild\": \"tsc\",\n \"build\": \"run-s build:*\",\n \"build:lib\": \"node build.mjs\",\n \"build:cjs\": \"dts-bundle-generator --no-banner --project tsconfig.cjs.json -o dist/cjs/index.d.cts src/entry-cjs.ts\",\n \"build:esm\": \"dts-bundle-generator --no-banner --project tsconfig.esm.json -o dist/esm/index.d.mts src/entry-esm.ts\",\n \"eslint\": \"eslint --cache .\",\n \"eslint:fix\": \"eslint --cache --fix .\",\n \"prepack\": \"release-prepack package.json --bundle\",\n \"postpack\": \"release-postpack package.json\",\n \"prepare\": \"husky\",\n \"prepublishOnly\": \"release-prepack package.json --bundle\",\n \"prettier:check\": \"prettier --check .\",\n \"prettier:write\": \"prettier --write .\",\n \"postpublish\": \"release-postpack package.json\",\n \"attw\": \"attw --no-emoji --pack .\",\n \"test\": \"jest\"\n },\n \"commitlint\": {\n \"extends\": \"@html-validate\"\n },\n \"prettier\": \"@html-validate/prettier-config\",\n \"release\": {\n \"extends\": \"@html-validate/semantic-release-config\"\n },\n \"jest\": {\n \"preset\": \"@html-validate/jest-config\"\n },\n \"dependencies\": {\n \"@html-validate/plugin-utils\": \"2.1.0\",\n \"semver\": \"7.7.3\"\n },\n \"devDependencies\": {\n \"@arethetypeswrong/cli\": \"0.18.2\",\n \"@html-validate/commitlint-config\": \"3.6.1\",\n \"@html-validate/eslint-config\": \"6.10.0\",\n \"@html-validate/eslint-config-jest\": \"6.10.0\",\n \"@html-validate/eslint-config-typescript\": \"6.10.0\",\n \"@html-validate/eslint-config-typescript-typeinfo\": \"6.10.0\",\n \"@html-validate/jest-config\": \"3.13.0\",\n \"@html-validate/prettier-config\": \"3.1.4\",\n \"@html-validate/release-scripts\": \"6.10.0\",\n \"@tsconfig/node18\": \"18.2.4\",\n \"@tsconfig/strictest\": \"2.0.6\",\n \"@types/estree\": \"1.0.8\",\n \"@types/jest\": \"29.5.14\",\n \"@types/node\": \"18.19.130\",\n \"@types/semver\": \"7.7.1\",\n \"dts-bundle-generator\": \"9.5.1\",\n \"esbuild\": \"0.25.10\",\n \"html-validate\": \"10.1.2\",\n \"husky\": \"9.1.7\",\n \"jest\": \"29.7.0\",\n \"jest-environment-jsdom\": \"29.7.0\",\n \"npm-pkg-lint\": \"4.1.2\",\n \"npm-run-all2\": \"8.0.4\",\n \"ts-jest\": \"29.4.5\",\n \"typescript\": \"5.9.3\"\n },\n \"peerDependencies\": {\n \"html-validate\": \"^8.10.0 || ^9.0.0 || ^10.0.0\"\n },\n \"engines\": {\n \"node\": \">= 18.0\"\n },\n \"externalDependencies\": [\n \"@html-validate/plugin-utils\"\n ]\n}\n", "import { defineMetadata } from \"html-validate\";\n\nexport default defineMetadata({\n\tcomponent: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tcomponent: \"is\",\n\t\trequiredAttributes: [\"is\"],\n\t},\n\n\t\"keep-alive\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\tportal: {\n\t\tdeprecated: {\n\t\t\tsource: \"vue\",\n\t\t\tmessage: \"the <portal> element has been renamed to <teleport>\",\n\t\t\tdocumentation: \"The `<portal>` element has been renamed to `<teleport>`\",\n\t\t},\n\t},\n\n\t\"router-link\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\t\"router-view\": {\n\t\tflow: true,\n\t\tslots: [\"default\"],\n\t},\n\n\tslot: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tscriptSupporting: true,\n\t},\n\n\tsuspense: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tslots: [\"default\", \"fallback\"],\n\t},\n\n\tteleport: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t},\n\n\ttransition: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\t\"transition-group\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tcomponent: \"tag\",\n\t},\n});\n", "import { type ConfigData } from \"html-validate\";\nimport vueElements from \"../elements\";\n\nexport function createConfig(): ConfigData {\n\tconst config: ConfigData = {\n\t\telements: [vueElements],\n\t\trules: {\n\t\t\t/* vue modifiers often use camelcase so allow by default */\n\t\t\t\"attr-case\": [\"error\", { style: \"camelcase\" }],\n\n\t\t\t/* self closing tags often used in vue code so allow by default*/\n\t\t\t\"void-style\": [\"error\", { style: \"selfclose\" }],\n\t\t\t\"no-self-closing\": \"off\",\n\n\t\t\t/* enable rules from this plugin */\n\t\t\t\"vue/available-slots\": \"error\",\n\t\t\t\"vue/prefer-slot-shorthand\": \"error\",\n\t\t\t\"vue/required-slots\": \"error\",\n\t\t},\n\t};\n\n\treturn config;\n}\n\nexport default createConfig();\n", "import recommended from \"./recommended\";\n\nexport default {\n\trecommended,\n};\n", "import { type DOMReadyEvent, type HtmlElement, type RuleDocumentation, Rule } from \"html-validate\";\nimport { findUsedSlots } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\tinterface MetaData {\n\t\tslots?: string[];\n\t}\n\tinterface MetaElement {\n\t\tslots?: string[];\n\t}\n}\n\ninterface Context {\n\telement: string;\n\tslot: string;\n\tavailable: string[];\n}\n\nfunction difference<T>(a: Set<T>, b: Set<T>): Set<T> {\n\tconst result = new Set(a);\n\tfor (const elem of b) {\n\t\tresult.delete(elem);\n\t}\n\treturn result;\n}\n\nexport class AvailableSlots extends Rule<Context> {\n\tpublic override documentation(context?: Context): RuleDocumentation {\n\t\tif (context) {\n\t\t\treturn {\n\t\t\t\tdescription: [\n\t\t\t\t\t`The <${context.element}> component does not have a slot named \"${context.slot}\". Only known slots can be specified.`,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"The following slots are available\",\n\t\t\t\t]\n\t\t\t\t\t.concat(context.available.map((slot) => `- ${slot}`))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdescription: \"Only known slots can be specified.\",\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"dom:ready\", (event: DOMReadyEvent) => {\n\t\t\tconst doc = event.document;\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-deprecated -- need to\n\t\t\t * use this for backwards compatibility until support for v7 is dropped */\n\t\t\tdoc.visitDepthFirst((node: HtmlElement) => {\n\t\t\t\t/* ignore rule if element has no meta or meta does not specify available slots */\n\t\t\t\tconst meta = node.meta;\n\t\t\t\tif (!meta?.slots) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.validateSlots(node, meta.slots);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate validateSlots(node: HtmlElement, slots: string[]): void {\n\t\tconst usedSlots = findUsedSlots(node);\n\t\tconst available = new Set(slots);\n\t\tconst used = new Set(usedSlots.keys());\n\t\tconst diff = difference(used, available);\n\n\t\tfor (const missing of diff) {\n\t\t\tconst context: Context = {\n\t\t\t\telement: node.tagName,\n\t\t\t\tslot: missing,\n\t\t\t\tavailable: slots,\n\t\t\t};\n\t\t\tthis.report(\n\t\t\t\tnode,\n\t\t\t\t`<${node.tagName}> component has no slot \"${missing}\"`,\n\t\t\t\tusedSlots.get(missing),\n\t\t\t\tcontext,\n\t\t\t);\n\t\t}\n\t}\n}\n", "/**\n * Strip anything inside `{{ .. }}` in case it contains anything that looks like\n * markup, i.e. it will be ignored\n */\nexport function stripTemplating(str: string): string {\n\t/* eslint-disable-next-line sonarjs/slow-regex -- technical debt, should refactor */\n\treturn str.replace(/{{(.*?)}}/g, (_, m: string) => {\n\t\tconst filler = \" \".repeat(m.length);\n\t\treturn `{{${filler}}}`;\n\t});\n}\n", "import { type HtmlElement, type Location } from \"html-validate\";\n\nconst slotAttr = /(?:v-slot:|#)([^[]+)/;\n\nfunction haveSlot(value: [string, Location] | null): value is [string, Location] {\n\treturn value !== null;\n}\n\n/**\n * Search all children for slots and return both slot names and locations.\n */\nexport function findUsedSlots(node: HtmlElement): Map<string, Location> {\n\tconst template = node.querySelectorAll(\">template, >[slot]\");\n\tconst slots = template.map((child) => findSlotAttribute(child)).filter(haveSlot);\n\tconst initial = new Map<string, Location>();\n\treturn slots.reduce((result: Map<string, Location>, [key, val]) => {\n\t\tresult.set(key, val);\n\t\treturn result;\n\t}, initial);\n}\n\n/**\n * Find the name of the slot and its location used by an element. Searches\n * both v-slot:foo and slot=\"foo\".\n */\nexport function findSlotAttribute(node: HtmlElement): [string, Location] | null {\n\tfor (const attr of node.attributes) {\n\t\t/* find v-slot directive */\n\t\tconst match = slotAttr.exec(attr.key);\n\t\tif (match) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if slot matches [1] will exist */\n\t\t\tconst slot = match[1]!;\n\t\t\treturn [slot, attr.keyLocation];\n\t\t}\n\n\t\t/* find deprecated slot attribute */\n\t\tif (attr.key === \"slot\" && typeof attr.value === \"string\") {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- valueLocation will always be set the value is present */\n\t\t\treturn [attr.value, attr.valueLocation!];\n\t\t}\n\t}\n\treturn null;\n}\n", "import { type AttributeEvent, type RuleDocumentation, DynamicValue, Rule } from \"html-validate\";\n\ninterface RuleContext {\n\tslot: string;\n}\n\nconst prefix = \"v-slot:\";\n\nfunction isVSlot(attr: string): string | null {\n\tif (!attr.startsWith(prefix)) {\n\t\treturn null;\n\t}\n\tif (attr.length <= prefix.length) {\n\t\treturn null;\n\t}\n\tconst slot = attr.slice(prefix.length);\n\tif (/^\\[.*\\]$/.exec(slot)) {\n\t\treturn null;\n\t}\n\treturn slot;\n}\n\nfunction isDeprecatedSlot(attr: string, value: null | string | DynamicValue): string | null {\n\tif (attr !== \"slot\") {\n\t\treturn null;\n\t}\n\tif (value instanceof DynamicValue) {\n\t\treturn null;\n\t}\n\tif (value === null || value === \"\") {\n\t\treturn null;\n\t}\n\treturn value;\n}\n\nexport class PreferSlotShorthand extends Rule<RuleContext> {\n\tpublic override documentation(context?: RuleContext): RuleDocumentation {\n\t\tconst slot = context?.slot ?? \"my-slot\";\n\t\treturn {\n\t\t\tdescription: [\n\t\t\t\t`Prefer to use \\`#${slot}\\` over \\`v-slot:${slot}\\`.`,\n\t\t\t\t\"\",\n\t\t\t\t\"Vue.js supports a shorthand syntax for slots using `#` instead of `v-slot:` or the deprecated `slot` attribute, e.g. using `#header` instead of `v-slot:header`.\",\n\t\t\t].join(\"\\n\"),\n\t\t};\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"attr\", (event: AttributeEvent) => {\n\t\t\tconst { key: attr, value, target, keyLocation: location } = event;\n\n\t\t\tlet slot: string | null;\n\n\t\t\t/* handle v-slot:xyz */\n\t\t\tslot = isVSlot(attr);\n\t\t\tif (slot) {\n\t\t\t\tconst context: RuleContext = { slot };\n\t\t\t\tconst message = `Prefer to use #${slot} over ${attr}`;\n\t\t\t\tthis.report(target, message, location, context);\n\t\t\t}\n\n\t\t\t/* handle slot=\"xyz\" */\n\t\t\tslot = isDeprecatedSlot(attr, value);\n\t\t\tif (slot) {\n\t\t\t\tconst context: RuleContext = { slot };\n\t\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- value is checked by isDeprecatedSlot */\n\t\t\t\tconst message = `Prefer to use #${slot} over ${attr}=\"${value!.toString()}\"`;\n\t\t\t\tthis.report(target, message, location, context);\n\t\t\t}\n\t\t});\n\t}\n}\n", "import { type DOMReadyEvent, type HtmlElement, type RuleDocumentation, Rule } from \"html-validate\";\nimport { findUsedSlots } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\tinterface MetaData {\n\t\trequiredSlots?: string[];\n\t}\n\tinterface MetaElement {\n\t\trequiredSlots?: string[];\n\t}\n}\n\ninterface Context {\n\telement: string;\n\tslot: string;\n\trequired: string[];\n}\n\nfunction difference<T>(a: Set<T>, b: Set<T>): Set<T> {\n\tconst result = new Set(a);\n\tfor (const elem of b) {\n\t\tresult.delete(elem);\n\t}\n\treturn result;\n}\n\nexport class RequiredSlots extends Rule<Context> {\n\tpublic override documentation(context?: Context): RuleDocumentation {\n\t\tif (context) {\n\t\t\treturn {\n\t\t\t\tdescription: [\n\t\t\t\t\t`The <${context.element}> component requires slot \"${context.slot}\" to be implemented. Add \\`<template v-slot:${context.slot}>\\``,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"The following slots are required\",\n\t\t\t\t]\n\t\t\t\t\t.concat(context.required.map((slot) => `- ${slot}`))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdescription: \"All required slots must be implemented.\",\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"dom:ready\", (event: DOMReadyEvent) => {\n\t\t\tconst doc = event.document;\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-deprecated -- need to\n\t\t\t * use this for backwards compatibility until support for v7 is dropped */\n\t\t\tdoc.visitDepthFirst((node: HtmlElement) => {\n\t\t\t\t/* ignore rule if element has no meta or meta does not specify available slots */\n\t\t\t\tconst meta = node.meta;\n\t\t\t\tif (!meta?.requiredSlots) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.validateSlots(node, meta.requiredSlots);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate validateSlots(node: HtmlElement, requiredSlots: string[]): void {\n\t\tconst usedSlots = findUsedSlots(node);\n\t\tconst required = new Set(requiredSlots);\n\t\tconst used = new Set(usedSlots.keys());\n\t\tconst diff = difference(required, used);\n\n\t\tfor (const missing of diff) {\n\t\t\tconst context: Context = {\n\t\t\t\telement: node.tagName,\n\t\t\t\tslot: missing,\n\t\t\t\trequired: requiredSlots,\n\t\t\t};\n\t\t\tthis.report(\n\t\t\t\tnode,\n\t\t\t\t`<${node.tagName}> component requires slot \"${missing}\" to be implemented`,\n\t\t\t\tnull,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t}\n\t}\n}\n", "import { AvailableSlots } from \"./available-slots\";\nimport { PreferSlotShorthand } from \"./prefer-slot-shorthand\";\nimport { RequiredSlots } from \"./required-slots\";\n\nconst rules = {\n\t\"vue/available-slots\": AvailableSlots,\n\t\"vue/prefer-slot-shorthand\": PreferSlotShorthand,\n\t\"vue/required-slots\": RequiredSlots,\n};\n\nexport default rules;\n", "{\n \"properties\": {\n \"component\": {\n \"type\": \"string\",\n \"copyable\": true\n },\n \"requiredSlots\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"slots\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n}\n", "import { type AttributeData, DynamicValue } from \"html-validate\";\n\nexport function* processAttribute(attr: AttributeData): Iterable<AttributeData> {\n\t/* always yield original attribute */\n\tyield attr;\n\n\t/* setup :foo and v-bind:foo alias */\n\tconst bind = /^(?:v-bind)?:(.*)$/.exec(attr.key);\n\tif (bind) {\n\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if bind matches [1] will exist */\n\t\tconst key = bind[1]!;\n\t\tyield {\n\t\t\t...attr,\n\t\t\tkey,\n\t\t\tvalue: new DynamicValue(attr.value ? String(attr.value) : \"\"),\n\t\t\toriginalAttribute: attr.key,\n\t\t};\n\t}\n}\n", "import {\n\ttype HtmlElement,\n\ttype MetaElement,\n\ttype ProcessElementContext,\n\tDynamicValue,\n} from \"html-validate\";\nimport { findSlotAttribute } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\texport interface MetaData {\n\t\tcomponent?: string;\n\t}\n}\n\nfunction isBound(node: HtmlElement): boolean {\n\treturn node.hasAttribute(\"v-html\");\n}\n\nfunction isSlot(node: HtmlElement): boolean {\n\treturn node.is(\"slot\");\n}\n\nfunction loadSlotMeta(context: ProcessElementContext, slotname: string, node: HtmlElement): void {\n\tconst parent = node.parent;\n\tif (!parent) {\n\t\treturn;\n\t}\n\n\t/* Generate a new virtual tagname to load meta element from */\n\tconst getMetaFor = (tagName: string): MetaElement | null => {\n\t\tconst meta = context.getMetaFor(tagName);\n\t\treturn meta && meta.tagName !== \"*\" ? meta : null;\n\t};\n\tconst key = `${parent.tagName}#${slotname}`;\n\tconst fallbackKey = `${parent.tagName}:${slotname}`;\n\tconst meta = getMetaFor(key) ?? getMetaFor(fallbackKey);\n\tif (!meta) {\n\t\treturn;\n\t}\n\n\tnode.loadMeta(meta);\n\n\t/* add an annotation so error messages will be more understandable */\n\tnode.setAnnotation(`slot \"${slotname}\" (<${parent.tagName}>)`);\n}\n\n/**\n * Handle <component> or a component with a slot wrapped in it.\n */\nfunction loadComponentMeta(\n\tcontext: ProcessElementContext,\n\tnode: HtmlElement,\n\tcomponent: string,\n): void {\n\tlet src: HtmlElement = node;\n\n\t/* if this is a slot with wrapped in a <component> we fetch attributes from\n\t * the parent element, i.e. the actual component */\n\tif (node.tagName === \"template\" && src.parent) {\n\t\tsrc = src.parent;\n\t}\n\n\t/* try to fetch the attribute containing the element to use */\n\tconst attr = src.getAttribute(component);\n\tif (!attr || attr.isDynamic) {\n\t\treturn;\n\t}\n\n\t/* use the attribute value to lookup new metadata based on the tagname */\n\tconst tagName = attr.value as string;\n\tconst meta = context.getMetaFor(tagName);\n\tif (!meta || meta.tagName === \"*\") {\n\t\treturn;\n\t}\n\n\tnode.loadMeta(meta);\n\n\t/* update or add new annotation so error messages will be more descriptive */\n\tif (node.isSameNode(src)) {\n\t\tnode.setAnnotation(`<${meta.tagName}> (<${node.tagName}>)`);\n\t} else {\n\t\tconst name = node.annotatedName.replace(\"(<\", `(<${meta.tagName}> via <`);\n\t\tnode.setAnnotation(name);\n\t}\n}\n\nexport function processElement(this: ProcessElementContext, node: HtmlElement): void {\n\tconst slot = findSlotAttribute(node);\n\n\t/* If this element is a slot we load new metadata properties onto the element\n\t * to support adding properties directly to slots, e.g. to allow/disallow\n\t * content in the slot. */\n\tif (slot) {\n\t\tconst [slotname] = slot;\n\t\tloadSlotMeta(this, slotname, node);\n\t}\n\n\t/* handle usage of <component>, either directly or inside a component */\n\tif (node.meta?.component) {\n\t\tloadComponentMeta(this, node, node.meta.component);\n\t}\n\n\t/* Since html-validate v9.5.4 `<template>` tags are generally ignored when\n\t * checking descendants but since v9.6.1 the checks are enabled if this flag\n\t * is disabled. This is a needed both for `<template #slot>` and when using\n\t * `<template>` inside a Vue SFC where the element is transparent instead of\n\t * acting as a `HTMLTemplateElement`. */\n\tif (node.is(\"template\") && node.meta) {\n\t\tnode.meta.templateRoot = false;\n\t}\n\n\t/* Mark as having dynamic text if the element either content bound via v-html\n\t * or if it is a slot. This is needed for rules with requires textual content,\n\t * e.g a heading cannot be empty. */\n\tif (isBound(node) || isSlot(node)) {\n\t\tnode.appendText(new DynamicValue(\"\"), node.location);\n\t}\n}\n", "import { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\n\n/**\n * Transform a regular HTML file. In practice this only applies hooks without\n * any extraction.\n */\nexport function* transformHTML(source: Source): Iterable<Source> {\n\tyield {\n\t\t...source,\n\t\thooks: {\n\t\t\tprocessAttribute,\n\t\t\tprocessElement,\n\t\t},\n\t};\n}\n\ntransformHTML.api = 1;\n", "import { TemplateExtractor } from \"@html-validate/plugin-utils\";\nimport { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\n\n/**\n * Match template property in `Vue.component` call\n */\nexport function transformJS(source: Source): Iterable<Source> {\n\tconst te = TemplateExtractor.fromString(source.data, source.filename);\n\treturn Array.from(te.extractObjectProperty(\"template\"), (cur) => {\n\t\tcur.originalData = source.originalData ?? source.data;\n\t\tcur.hooks = {\n\t\t\tprocessAttribute,\n\t\t\tprocessElement,\n\t\t};\n\t\treturn cur;\n\t});\n}\n\ntransformJS.api = 1;\n", "import { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\nimport { stripTemplating } from \"../utils\";\n\nfunction findLocation(source: string, index: number, preamble: number): [number, number] {\n\tlet line = 1;\n\tlet prev = 0;\n\tlet pos = source.indexOf(\"\\n\");\n\twhile (pos !== -1) {\n\t\tif (pos > index) {\n\t\t\treturn [line, index - prev + preamble + 1];\n\t\t}\n\t\tline++;\n\t\tprev = pos;\n\t\tpos = source.indexOf(\"\\n\", pos + 1);\n\t}\n\treturn [line, 1];\n}\n\nfunction computeIndent(text: string): string {\n\tconst lines = text.split(\"\\n\");\n\tconst initial = null as string | null;\n\tconst common = lines.reduce((common, line) => {\n\t\tconst match = /^(\\s*)\\S/.exec(line);\n\t\tif (match) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if match matches [1] will exist */\n\t\t\tconst indent = match[1]!;\n\t\t\treturn common === null || indent.length < common.length ? indent : common;\n\t\t} else {\n\t\t\treturn common;\n\t\t}\n\t}, initial);\n\treturn common ?? \"\";\n}\n\n/**\n * Match templates from SFC <template> tag\n */\nexport function* transformSFC(source: Source): Iterable<Source> {\n\tconst indent = computeIndent(source.data);\n\t/* eslint-disable-next-line security/detect-non-literal-regexp -- will only contain whitespace */\n\tconst sfc = new RegExp(`^${indent}(<template([^>]*)>)([^]*?)^${indent}(</template>)`, \"gm\");\n\tlet match: RegExpExecArray | null;\n\twhile ((match = sfc.exec(source.data)) !== null) {\n\t\tconst attr = match[2] ?? \"\";\n\t\tconst data = `${match[1]!}${match[3]!}${match[4]!}`; // eslint-disable-line @typescript-eslint/no-non-null-assertion -- groups exists when regex matches\n\t\tif (!/lang=\".*?\"/.exec(attr)) {\n\t\t\tconst [line, column] = findLocation(source.data, match.index, 0);\n\t\t\tyield {\n\t\t\t\tdata: stripTemplating(data),\n\t\t\t\tfilename: source.filename,\n\t\t\t\tline: line + (source.line - 1),\n\t\t\t\tcolumn: column + (source.column - 1),\n\t\t\t\toffset: match.index + source.offset,\n\t\t\t\toriginalData: source.originalData ?? source.data,\n\t\t\t\thooks: {\n\t\t\t\t\tprocessAttribute,\n\t\t\t\t\tprocessElement,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n}\n\ntransformSFC.api = 1;\n", "import { type Source } from \"html-validate\";\nimport { transformHTML } from \"./html.transform\";\nimport { transformJS } from \"./js.transform\";\nimport { transformSFC } from \"./sfc.transform\";\n\n/**\n * Returns true if the source is considered a SFC component\n */\nfunction isVue(source: Source): boolean {\n\treturn !!/\\.vue$/i.exec(source.filename);\n}\n\n/**\n * Returns true if the source is considered javascript\n */\nfunction isJavascript(source: Source): boolean {\n\treturn !!/\\.(jsx?|tsx?)$/i.exec(source.filename);\n}\n\nexport function* autodetect(source: Source): Iterable<Source> {\n\tif (isVue(source)) {\n\t\tyield* transformSFC(source);\n\t} else if (isJavascript(source)) {\n\t\tyield* transformJS(source);\n\t} else {\n\t\tyield* transformHTML(source);\n\t}\n}\n\nautodetect.api = 1;\n", "import { type Transformer } from \"html-validate\";\nimport { autodetect } from \"./auto.transform\";\nimport { transformHTML } from \"./html.transform\";\nimport { transformJS } from \"./js.transform\";\nimport { transformSFC } from \"./sfc.transform\";\n\nconst transformer: Record<string, Transformer> = {\n\tdefault: autodetect,\n\tauto: autodetect,\n\tjs: transformJS,\n\tsfc: transformSFC,\n\thtml: transformHTML,\n};\n\nexport default transformer;\n", "/* istanbul ignore file */\n\nimport plugin from \"./index\";\n\nexport default plugin;\n"],
5
- "mappings": "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",
6
- "names": ["Rule", "Rule", "difference", "Rule", "DynamicValue", "DynamicValue", "meta", "name", "DynamicValue", "common"]
3
+ "sources": ["../../src/index.ts", "../../package.json", "../../src/elements.ts", "../../src/configs/recommended.ts", "../../src/configs/index.ts", "../../src/rules/available-slots.ts", "../../src/utils/strip-templating.ts", "../../src/utils/slots.ts", "../../src/rules/deprecated-slot.ts", "../../src/rules/prefer-slot-shorthand.ts", "../../src/rules/required-slots.ts", "../../src/rules/index.ts", "../../src/schema.json", "../../src/hooks/attribute.ts", "../../src/hooks/element.ts", "../../src/transform/html.transform.ts", "../../src/transform/js.transform.ts", "../../src/transform/sfc.transform.ts", "../../src/transform/auto.transform.ts", "../../src/transform/index.ts", "../../src/entry-esm.ts"],
4
+ "sourcesContent": ["import { type Plugin, compatibilityCheck } from \"html-validate\";\nimport { name, peerDependencies } from \"../package.json\";\nimport configs from \"./configs\";\nimport rules from \"./rules\";\nimport elementSchema from \"./schema.json\";\nimport transformer from \"./transform\";\n\nconst range = peerDependencies[\"html-validate\"];\ncompatibilityCheck(name, range);\n\nconst plugin: Plugin = {\n\tname,\n\tconfigs,\n\trules,\n\ttransformer,\n\telementSchema,\n};\n\nexport default plugin;\n", "{\n \"name\": \"html-validate-vue\",\n \"version\": \"7.4.0\",\n \"description\": \"vue transform for html-validate\",\n \"keywords\": [\n \"html\",\n \"lint\",\n \"html-validate\",\n \"vue\"\n ],\n \"homepage\": \"https://html-validate.org/frameworks/vue.html\",\n \"bugs\": {\n \"url\": \"https://gitlab.com/html-validate/html-validate-vue/issues/new\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://gitlab.com/html-validate/html-validate-vue.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"David Sveningsson <ext@sidvind.com>\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/esm/index.d.mts\",\n \"default\": \"./dist/esm/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/cjs/index.d.cts\",\n \"default\": \"./dist/cjs/index.cjs\"\n }\n }\n },\n \"main\": \"dist/cjs/index.cjs\",\n \"module\": \"dist/esm/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"prebuild\": \"tsc\",\n \"build\": \"run-s build:*\",\n \"build:lib\": \"node build.mjs\",\n \"build:cjs\": \"dts-bundle-generator --no-banner --project tsconfig.cjs.json -o dist/cjs/index.d.cts src/entry-cjs.ts\",\n \"build:esm\": \"dts-bundle-generator --no-banner --project tsconfig.esm.json -o dist/esm/index.d.mts src/entry-esm.ts\",\n \"eslint\": \"eslint --cache .\",\n \"eslint:fix\": \"eslint --cache --fix .\",\n \"prepack\": \"release-prepack package.json --bundle\",\n \"postpack\": \"release-postpack package.json\",\n \"prepare\": \"husky\",\n \"prepublishOnly\": \"release-prepack package.json --bundle\",\n \"prettier:check\": \"prettier --check .\",\n \"prettier:write\": \"prettier --write .\",\n \"postpublish\": \"release-postpack package.json\",\n \"attw\": \"attw --no-emoji --pack .\",\n \"test\": \"jest\"\n },\n \"commitlint\": {\n \"extends\": \"@html-validate\"\n },\n \"prettier\": \"@html-validate/prettier-config\",\n \"release\": {\n \"extends\": \"@html-validate/semantic-release-config\"\n },\n \"jest\": {\n \"preset\": \"@html-validate/jest-config\"\n },\n \"dependencies\": {\n \"@html-validate/plugin-utils\": \"2.2.0\",\n \"semver\": \"7.7.3\"\n },\n \"devDependencies\": {\n \"@arethetypeswrong/cli\": \"0.18.2\",\n \"@html-validate/commitlint-config\": \"3.6.1\",\n \"@html-validate/eslint-config\": \"6.10.5\",\n \"@html-validate/eslint-config-jest\": \"6.10.5\",\n \"@html-validate/eslint-config-typescript\": \"6.10.5\",\n \"@html-validate/eslint-config-typescript-typeinfo\": \"6.10.5\",\n \"@html-validate/jest-config\": \"3.13.0\",\n \"@html-validate/prettier-config\": \"3.1.6\",\n \"@html-validate/release-scripts\": \"7.1.0\",\n \"@tsconfig/node18\": \"18.2.6\",\n \"@tsconfig/strictest\": \"2.0.8\",\n \"@types/estree\": \"1.0.8\",\n \"@types/jest\": \"30.0.0\",\n \"@types/node\": \"18.19.130\",\n \"@types/semver\": \"7.7.1\",\n \"dts-bundle-generator\": \"9.5.1\",\n \"esbuild\": \"0.27.0\",\n \"html-validate\": \"10.4.0\",\n \"husky\": \"9.1.7\",\n \"jest\": \"30.2.0\",\n \"jest-environment-jsdom\": \"30.2.0\",\n \"npm-pkg-lint\": \"4.3.1\",\n \"npm-run-all2\": \"8.0.4\",\n \"ts-jest\": \"29.4.5\",\n \"typescript\": \"5.9.3\"\n },\n \"peerDependencies\": {\n \"html-validate\": \"^8.21.0 || ^9.0.0 || ^10.0.0\"\n },\n \"engines\": {\n \"node\": \">= 18.0\"\n },\n \"externalDependencies\": [\n \"@html-validate/plugin-utils\"\n ]\n}\n", "import { defineMetadata } from \"html-validate\";\n\nexport default defineMetadata({\n\tcomponent: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tcomponent: \"is\",\n\t\trequiredAttributes: [\"is\"],\n\t},\n\n\t\"keep-alive\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\tportal: {\n\t\tdeprecated: {\n\t\t\tsource: \"vue\",\n\t\t\tmessage: \"the <portal> element has been renamed to <teleport>\",\n\t\t\tdocumentation: \"The `<portal>` element has been renamed to `<teleport>`\",\n\t\t},\n\t},\n\n\t\"router-link\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\t\"router-view\": {\n\t\tflow: true,\n\t\tslots: [\"default\"],\n\t},\n\n\tslot: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tscriptSupporting: true,\n\t},\n\n\tsuspense: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tslots: [\"default\", \"fallback\"],\n\t},\n\n\tteleport: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t},\n\n\ttransition: {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t},\n\n\t\"transition-group\": {\n\t\tflow: true,\n\t\tphrasing: true,\n\t\ttransparent: true,\n\t\tcomponent: \"tag\",\n\t},\n});\n", "import { type ConfigData } from \"html-validate\";\nimport vueElements from \"../elements\";\n\nexport function createConfig(): ConfigData {\n\tconst config: ConfigData = {\n\t\telements: [vueElements],\n\t\trules: {\n\t\t\t/* vue modifiers often use camelcase so allow by default */\n\t\t\t\"attr-case\": [\"error\", { style: \"camelcase\" }],\n\n\t\t\t/* self closing tags often used in vue code so allow by default*/\n\t\t\t\"void-style\": [\"error\", { style: \"selfclose\" }],\n\t\t\t\"no-self-closing\": \"off\",\n\n\t\t\t/* enable rules from this plugin */\n\t\t\t\"vue/available-slots\": \"error\",\n\t\t\t\"vue/prefer-slot-shorthand\": \"error\",\n\t\t\t\"vue/required-slots\": \"error\",\n\t\t},\n\t};\n\n\treturn config;\n}\n\nexport default createConfig();\n", "import recommended from \"./recommended\";\n\nexport default {\n\trecommended,\n};\n", "import {\n\ttype DOMReadyEvent,\n\ttype HtmlElement,\n\ttype RuleDocumentation,\n\tRule,\n\twalk,\n} from \"html-validate\";\nimport { findUsedSlots } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\tinterface MetaData {\n\t\tslots?: string[];\n\t}\n\tinterface MetaElement {\n\t\tslots?: string[];\n\t}\n}\n\ninterface Context {\n\telement: string;\n\tslot: string;\n\tavailable: string[];\n}\n\nfunction difference<T>(a: Set<T>, b: Set<T>): Set<T> {\n\tconst result = new Set(a);\n\tfor (const elem of b) {\n\t\tresult.delete(elem);\n\t}\n\treturn result;\n}\n\nexport class AvailableSlots extends Rule<Context> {\n\tpublic override documentation(context?: Context): RuleDocumentation {\n\t\tif (context) {\n\t\t\treturn {\n\t\t\t\tdescription: [\n\t\t\t\t\t`The <${context.element}> component does not have a slot named \"${context.slot}\". Only known slots can be specified.`,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"The following slots are available\",\n\t\t\t\t]\n\t\t\t\t\t.concat(context.available.map((slot) => `- ${slot}`))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdescription: \"Only known slots can be specified.\",\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"dom:ready\", (event: DOMReadyEvent) => {\n\t\t\tconst doc = event.document;\n\t\t\twalk.depthFirst(doc, (node: HtmlElement) => {\n\t\t\t\t/* ignore rule if element has no meta or meta does not specify available slots */\n\t\t\t\tconst meta = node.meta;\n\t\t\t\tif (!meta?.slots) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.validateSlots(node, meta.slots);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate validateSlots(node: HtmlElement, slots: string[]): void {\n\t\tconst usedSlots = findUsedSlots(node);\n\t\tconst available = new Set(slots);\n\t\tconst used = new Set(usedSlots.keys());\n\t\tconst diff = difference(used, available);\n\n\t\tfor (const missing of diff) {\n\t\t\tconst context: Context = {\n\t\t\t\telement: node.tagName,\n\t\t\t\tslot: missing,\n\t\t\t\tavailable: slots,\n\t\t\t};\n\t\t\tthis.report(\n\t\t\t\tnode,\n\t\t\t\t`<${node.tagName}> component has no slot \"${missing}\"`,\n\t\t\t\tusedSlots.get(missing),\n\t\t\t\tcontext,\n\t\t\t);\n\t\t}\n\t}\n}\n", "/**\n * Strip anything inside `{{ .. }}` in case it contains anything that looks like\n * markup, i.e. it will be ignored\n */\nexport function stripTemplating(str: string): string {\n\t/* eslint-disable-next-line sonarjs/slow-regex -- technical debt, should refactor */\n\treturn str.replace(/{{(.*?)}}/g, (_, m: string) => {\n\t\tconst filler = \" \".repeat(m.length);\n\t\treturn `{{${filler}}}`;\n\t});\n}\n", "import { type HtmlElement, type Location } from \"html-validate\";\n\nconst slotAttr = /(?:v-slot:|#)([^[]+)/;\n\nfunction haveSlot(value: [string, Location] | null): value is [string, Location] {\n\treturn value !== null;\n}\n\n/**\n * Search all children for slots and return both slot names and locations.\n */\nexport function findUsedSlots(node: HtmlElement): Map<string, Location> {\n\tconst template = node.querySelectorAll(\">template, >[slot]\");\n\tconst slots = template.map((child) => findSlotAttribute(child)).filter(haveSlot);\n\tconst initial = new Map<string, Location>();\n\treturn slots.reduce((result: Map<string, Location>, [key, val]) => {\n\t\tresult.set(key, val);\n\t\treturn result;\n\t}, initial);\n}\n\n/**\n * Find the name of the slot and its location used by an element. Searches\n * both v-slot:foo and slot=\"foo\".\n */\nexport function findSlotAttribute(node: HtmlElement): [string, Location] | null {\n\tfor (const attr of node.attributes) {\n\t\t/* find v-slot directive */\n\t\tconst match = slotAttr.exec(attr.key);\n\t\tif (match) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if slot matches [1] will exist */\n\t\t\tconst slot = match[1]!;\n\t\t\treturn [slot, attr.keyLocation];\n\t\t}\n\n\t\t/* find deprecated slot attribute */\n\t\tif (attr.key === \"slot\" && typeof attr.value === \"string\") {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- valueLocation will always be set the value is present */\n\t\t\treturn [attr.value, attr.valueLocation!];\n\t\t}\n\t}\n\treturn null;\n}\n", "import {\n\ttype DOMReadyEvent,\n\ttype HtmlElement,\n\ttype RuleDocumentation,\n\tRule,\n\twalk,\n} from \"html-validate\";\nimport { findUsedSlots } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\tinterface MetaData {\n\t\tdeprecatedSlots?: Record<string, boolean | string>;\n\t}\n\tinterface MetaElement {\n\t\trequiredSlots?: string[];\n\t\tdeprecatedSlots?: Record<string, boolean | string>;\n\t}\n}\n\n/** @internal */\nexport interface RuleContext {\n\telement: string;\n\tslot: string;\n\tinfo: string | null;\n}\n\nexport class DeprecatedSlot extends Rule<RuleContext> {\n\tpublic override documentation(context?: RuleContext): RuleDocumentation {\n\t\tif (context) {\n\t\t\tconst preamble = `The slot \\`${context.slot}\\` is deprecated and must not be used`;\n\t\t\treturn {\n\t\t\t\tdescription: context.info ? `${preamble}: ${context.info}.` : `${preamble}.`,\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdescription: \"This slot is deprecated and must not be used.\",\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"dom:ready\", (event: DOMReadyEvent) => {\n\t\t\tconst doc = event.document;\n\t\t\twalk.depthFirst(doc, (node: HtmlElement) => {\n\t\t\t\t/* ignore rule if element has no meta or meta does not specify deprecated slots */\n\t\t\t\tconst deprecatedSlots = node.meta?.deprecatedSlots;\n\t\t\t\tif (!deprecatedSlots) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.validateSlots(node, deprecatedSlots);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate validateSlots(\n\t\tnode: HtmlElement,\n\t\tdeprecatedSlots: Record<string, boolean | string>,\n\t): void {\n\t\tconst slots = findUsedSlots(node);\n\t\tfor (const [slot, location] of slots.entries()) {\n\t\t\tconst deprecated = deprecatedSlots[slot];\n\t\t\tif (!deprecated) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst context: RuleContext = {\n\t\t\t\telement: node.tagName,\n\t\t\t\tslot,\n\t\t\t\tinfo: typeof deprecated === \"string\" ? deprecated : null,\n\t\t\t};\n\t\t\tconst preamble = `slot \"${slot}\" is deprecated`;\n\t\t\tconst message = typeof deprecated === \"string\" ? `${preamble}: ${deprecated}` : preamble;\n\t\t\tthis.report({\n\t\t\t\tnode,\n\t\t\t\tmessage,\n\t\t\t\tlocation,\n\t\t\t\tcontext,\n\t\t\t});\n\t\t}\n\t}\n}\n", "import { type AttributeEvent, type RuleDocumentation, DynamicValue, Rule } from \"html-validate\";\n\ninterface RuleContext {\n\tslot: string;\n}\n\nconst prefix = \"v-slot:\";\n\nfunction isVSlot(attr: string): string | null {\n\tif (!attr.startsWith(prefix)) {\n\t\treturn null;\n\t}\n\tif (attr.length <= prefix.length) {\n\t\treturn null;\n\t}\n\tconst slot = attr.slice(prefix.length);\n\tif (/^\\[.*\\]$/.exec(slot)) {\n\t\treturn null;\n\t}\n\treturn slot;\n}\n\nfunction isDeprecatedSlot(attr: string, value: null | string | DynamicValue): string | null {\n\tif (attr !== \"slot\") {\n\t\treturn null;\n\t}\n\tif (value instanceof DynamicValue) {\n\t\treturn null;\n\t}\n\tif (value === null || value === \"\") {\n\t\treturn null;\n\t}\n\treturn value;\n}\n\nexport class PreferSlotShorthand extends Rule<RuleContext> {\n\tpublic override documentation(context?: RuleContext): RuleDocumentation {\n\t\tconst slot = context?.slot ?? \"my-slot\";\n\t\treturn {\n\t\t\tdescription: [\n\t\t\t\t`Prefer to use \\`#${slot}\\` over \\`v-slot:${slot}\\`.`,\n\t\t\t\t\"\",\n\t\t\t\t\"Vue.js supports a shorthand syntax for slots using `#` instead of `v-slot:` or the deprecated `slot` attribute, e.g. using `#header` instead of `v-slot:header`.\",\n\t\t\t].join(\"\\n\"),\n\t\t};\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"attr\", (event: AttributeEvent) => {\n\t\t\tconst { key: attr, value, target, keyLocation: location } = event;\n\n\t\t\tlet slot: string | null;\n\n\t\t\t/* handle v-slot:xyz */\n\t\t\tslot = isVSlot(attr);\n\t\t\tif (slot) {\n\t\t\t\tconst context: RuleContext = { slot };\n\t\t\t\tconst message = `Prefer to use #${slot} over ${attr}`;\n\t\t\t\tthis.report(target, message, location, context);\n\t\t\t}\n\n\t\t\t/* handle slot=\"xyz\" */\n\t\t\tslot = isDeprecatedSlot(attr, value);\n\t\t\tif (slot) {\n\t\t\t\tconst context: RuleContext = { slot };\n\t\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- value is checked by isDeprecatedSlot */\n\t\t\t\tconst message = `Prefer to use #${slot} over ${attr}=\"${value!.toString()}\"`;\n\t\t\t\tthis.report(target, message, location, context);\n\t\t\t}\n\t\t});\n\t}\n}\n", "import {\n\ttype DOMReadyEvent,\n\ttype HtmlElement,\n\ttype RuleDocumentation,\n\tRule,\n\twalk,\n} from \"html-validate\";\nimport { findUsedSlots } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\tinterface MetaData {\n\t\trequiredSlots?: string[];\n\t}\n\tinterface MetaElement {\n\t\trequiredSlots?: string[];\n\t}\n}\n\ninterface Context {\n\telement: string;\n\tslot: string;\n\trequired: string[];\n}\n\nfunction difference<T>(a: Set<T>, b: Set<T>): Set<T> {\n\tconst result = new Set(a);\n\tfor (const elem of b) {\n\t\tresult.delete(elem);\n\t}\n\treturn result;\n}\n\nexport class RequiredSlots extends Rule<Context> {\n\tpublic override documentation(context?: Context): RuleDocumentation {\n\t\tif (context) {\n\t\t\treturn {\n\t\t\t\tdescription: [\n\t\t\t\t\t`The <${context.element}> component requires slot \"${context.slot}\" to be implemented. Add \\`<template v-slot:${context.slot}>\\``,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"The following slots are required\",\n\t\t\t\t]\n\t\t\t\t\t.concat(context.required.map((slot) => `- ${slot}`))\n\t\t\t\t\t.join(\"\\n\"),\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tdescription: \"All required slots must be implemented.\",\n\t\t\t};\n\t\t}\n\t}\n\n\tpublic setup(): void {\n\t\tthis.on(\"dom:ready\", (event: DOMReadyEvent) => {\n\t\t\tconst doc = event.document;\n\t\t\twalk.depthFirst(doc, (node: HtmlElement) => {\n\t\t\t\t/* ignore rule if element has no meta or meta does not specify available slots */\n\t\t\t\tconst meta = node.meta;\n\t\t\t\tif (!meta?.requiredSlots) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.validateSlots(node, meta.requiredSlots);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate validateSlots(node: HtmlElement, requiredSlots: string[]): void {\n\t\tconst usedSlots = findUsedSlots(node);\n\t\tconst required = new Set(requiredSlots);\n\t\tconst used = new Set(usedSlots.keys());\n\t\tconst diff = difference(required, used);\n\n\t\tfor (const missing of diff) {\n\t\t\tconst context: Context = {\n\t\t\t\telement: node.tagName,\n\t\t\t\tslot: missing,\n\t\t\t\trequired: requiredSlots,\n\t\t\t};\n\t\t\tthis.report(\n\t\t\t\tnode,\n\t\t\t\t`<${node.tagName}> component requires slot \"${missing}\" to be implemented`,\n\t\t\t\tnull,\n\t\t\t\tcontext,\n\t\t\t);\n\t\t}\n\t}\n}\n", "import { AvailableSlots } from \"./available-slots\";\nimport { DeprecatedSlot } from \"./deprecated-slot\";\nimport { PreferSlotShorthand } from \"./prefer-slot-shorthand\";\nimport { RequiredSlots } from \"./required-slots\";\n\nconst rules = {\n\t\"vue/available-slots\": AvailableSlots,\n\t\"vue/deprecated-slot\": DeprecatedSlot,\n\t\"vue/prefer-slot-shorthand\": PreferSlotShorthand,\n\t\"vue/required-slots\": RequiredSlots,\n};\n\nexport default rules;\n", "{\n \"properties\": {\n \"component\": {\n \"type\": \"string\",\n \"copyable\": true\n },\n \"deprecatedSlots\": {\n \"type\": \"object\",\n \"patternProperties\": {\n \".*\": {\n \"anyOf\": [{ \"type\": \"boolean\" }, { \"type\": \"string\" }]\n }\n }\n },\n \"requiredSlots\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"slots\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n}\n", "import { type AttributeData, DynamicValue } from \"html-validate\";\n\nexport function* processAttribute(attr: AttributeData): Iterable<AttributeData> {\n\t/* always yield original attribute */\n\tyield attr;\n\n\t/* setup :foo and v-bind:foo alias */\n\tconst bind = /^(?:v-bind)?:(.*)$/.exec(attr.key);\n\tif (bind) {\n\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if bind matches [1] will exist */\n\t\tconst key = bind[1]!;\n\t\tyield {\n\t\t\t...attr,\n\t\t\tkey,\n\t\t\tvalue: new DynamicValue(attr.value ? String(attr.value) : \"\"),\n\t\t\toriginalAttribute: attr.key,\n\t\t};\n\t}\n}\n", "import {\n\ttype HtmlElement,\n\ttype MetaElement,\n\ttype ProcessElementContext,\n\tDynamicValue,\n} from \"html-validate\";\nimport { findSlotAttribute } from \"../utils\";\n\ndeclare module \"html-validate\" {\n\texport interface MetaData {\n\t\tcomponent?: string;\n\t}\n}\n\nfunction isBound(node: HtmlElement): boolean {\n\treturn node.hasAttribute(\"v-html\");\n}\n\nfunction isSlot(node: HtmlElement): boolean {\n\treturn node.is(\"slot\");\n}\n\nfunction loadSlotMeta(context: ProcessElementContext, slotname: string, node: HtmlElement): void {\n\tconst parent = node.parent;\n\tif (!parent) {\n\t\treturn;\n\t}\n\n\t/* Generate a new virtual tagname to load meta element from */\n\tconst getMetaFor = (tagName: string): MetaElement | null => {\n\t\tconst meta = context.getMetaFor(tagName);\n\t\treturn meta && meta.tagName !== \"*\" ? meta : null;\n\t};\n\tconst key = `${parent.tagName}#${slotname}`;\n\tconst fallbackKey = `${parent.tagName}:${slotname}`;\n\tconst meta = getMetaFor(key) ?? getMetaFor(fallbackKey);\n\tif (!meta) {\n\t\treturn;\n\t}\n\n\tnode.loadMeta(meta);\n\n\t/* add an annotation so error messages will be more understandable */\n\tnode.setAnnotation(`slot \"${slotname}\" (<${parent.tagName}>)`);\n}\n\n/**\n * Handle <component> or a component with a slot wrapped in it.\n */\nfunction loadComponentMeta(\n\tcontext: ProcessElementContext,\n\tnode: HtmlElement,\n\tcomponent: string,\n): void {\n\tlet src: HtmlElement = node;\n\n\t/* if this is a slot with wrapped in a <component> we fetch attributes from\n\t * the parent element, i.e. the actual component */\n\tif (node.tagName === \"template\" && src.parent) {\n\t\tsrc = src.parent;\n\t}\n\n\t/* try to fetch the attribute containing the element to use */\n\tconst attr = src.getAttribute(component);\n\tif (!attr || attr.isDynamic) {\n\t\treturn;\n\t}\n\n\t/* use the attribute value to lookup new metadata based on the tagname */\n\tconst tagName = attr.value as string;\n\tconst meta = context.getMetaFor(tagName);\n\tif (!meta || meta.tagName === \"*\") {\n\t\treturn;\n\t}\n\n\tnode.loadMeta(meta);\n\n\t/* update or add new annotation so error messages will be more descriptive */\n\tif (node.isSameNode(src)) {\n\t\tnode.setAnnotation(`<${meta.tagName}> (<${node.tagName}>)`);\n\t} else {\n\t\tconst name = node.annotatedName.replace(\"(<\", `(<${meta.tagName}> via <`);\n\t\tnode.setAnnotation(name);\n\t}\n}\n\nexport function processElement(this: ProcessElementContext, node: HtmlElement): void {\n\tconst slot = findSlotAttribute(node);\n\n\t/* If this element is a slot we load new metadata properties onto the element\n\t * to support adding properties directly to slots, e.g. to allow/disallow\n\t * content in the slot. */\n\tif (slot) {\n\t\tconst [slotname] = slot;\n\t\tloadSlotMeta(this, slotname, node);\n\t}\n\n\t/* handle usage of <component>, either directly or inside a component */\n\tif (node.meta?.component) {\n\t\tloadComponentMeta(this, node, node.meta.component);\n\t}\n\n\t/* Since html-validate v9.5.4 `<template>` tags are generally ignored when\n\t * checking descendants but since v9.6.1 the checks are enabled if this flag\n\t * is disabled. This is a needed both for `<template #slot>` and when using\n\t * `<template>` inside a Vue SFC where the element is transparent instead of\n\t * acting as a `HTMLTemplateElement`. */\n\tif (node.is(\"template\") && node.meta) {\n\t\tnode.meta.templateRoot = false;\n\t}\n\n\t/* Mark as having dynamic text if the element either content bound via v-html\n\t * or if it is a slot. This is needed for rules with requires textual content,\n\t * e.g a heading cannot be empty. */\n\tif (isBound(node) || isSlot(node)) {\n\t\tnode.appendText(new DynamicValue(\"\"), node.location);\n\t}\n}\n", "import { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\n\n/**\n * Transform a regular HTML file. In practice this only applies hooks without\n * any extraction.\n */\nexport function* transformHTML(source: Source): Iterable<Source> {\n\tyield {\n\t\t...source,\n\t\thooks: {\n\t\t\tprocessAttribute,\n\t\t\tprocessElement,\n\t\t},\n\t};\n}\n\ntransformHTML.api = 1;\n", "import { TemplateExtractor } from \"@html-validate/plugin-utils\";\nimport { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\n\n/**\n * Match template property in `Vue.component` call\n */\nexport function transformJS(source: Source): Iterable<Source> {\n\tconst te = TemplateExtractor.fromString(source.data, source.filename);\n\treturn Array.from(te.extractObjectProperty(\"template\"), (cur) => {\n\t\tcur.originalData = source.originalData ?? source.data;\n\t\tcur.hooks = {\n\t\t\tprocessAttribute,\n\t\t\tprocessElement,\n\t\t};\n\t\treturn cur;\n\t});\n}\n\ntransformJS.api = 1;\n", "import { type Source } from \"html-validate\";\nimport { processAttribute, processElement } from \"../hooks\";\nimport { stripTemplating } from \"../utils\";\n\nfunction findLocation(source: string, index: number, preamble: number): [number, number] {\n\tlet line = 1;\n\tlet prev = 0;\n\tlet pos = source.indexOf(\"\\n\");\n\twhile (pos !== -1) {\n\t\tif (pos > index) {\n\t\t\treturn [line, index - prev + preamble + 1];\n\t\t}\n\t\tline++;\n\t\tprev = pos;\n\t\tpos = source.indexOf(\"\\n\", pos + 1);\n\t}\n\treturn [line, 1];\n}\n\nfunction computeIndent(text: string): string {\n\tconst lines = text.split(\"\\n\");\n\tconst initial = null as string | null;\n\tconst common = lines.reduce((common, line) => {\n\t\tconst match = /^(\\s*)\\S/.exec(line);\n\t\tif (match) {\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- if match matches [1] will exist */\n\t\t\tconst indent = match[1]!;\n\t\t\treturn common === null || indent.length < common.length ? indent : common;\n\t\t} else {\n\t\t\treturn common;\n\t\t}\n\t}, initial);\n\treturn common ?? \"\";\n}\n\n/**\n * Match templates from SFC <template> tag\n */\nexport function* transformSFC(source: Source): Iterable<Source> {\n\tconst indent = computeIndent(source.data);\n\t/* eslint-disable-next-line security/detect-non-literal-regexp -- will only contain whitespace */\n\tconst sfc = new RegExp(`^${indent}(<template([^>]*)>)([^]*?)^${indent}(</template>)`, \"gm\");\n\tlet match: RegExpExecArray | null;\n\twhile ((match = sfc.exec(source.data)) !== null) {\n\t\tconst attr = match[2] ?? \"\";\n\t\tconst data = `${match[1]!}${match[3]!}${match[4]!}`; // eslint-disable-line @typescript-eslint/no-non-null-assertion -- groups exists when regex matches\n\t\tif (!/lang=\".*?\"/.exec(attr)) {\n\t\t\tconst [line, column] = findLocation(source.data, match.index, 0);\n\t\t\tyield {\n\t\t\t\tdata: stripTemplating(data),\n\t\t\t\tfilename: source.filename,\n\t\t\t\tline: line + (source.line - 1),\n\t\t\t\tcolumn: column + (source.column - 1),\n\t\t\t\toffset: match.index + source.offset,\n\t\t\t\toriginalData: source.originalData ?? source.data,\n\t\t\t\thooks: {\n\t\t\t\t\tprocessAttribute,\n\t\t\t\t\tprocessElement,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n}\n\ntransformSFC.api = 1;\n", "import { type Source } from \"html-validate\";\nimport { transformHTML } from \"./html.transform\";\nimport { transformJS } from \"./js.transform\";\nimport { transformSFC } from \"./sfc.transform\";\n\n/**\n * Returns true if the source is considered a SFC component\n */\nfunction isVue(source: Source): boolean {\n\treturn !!/\\.vue$/i.exec(source.filename);\n}\n\n/**\n * Returns true if the source is considered javascript\n */\nfunction isJavascript(source: Source): boolean {\n\treturn !!/\\.(jsx?|tsx?)$/i.exec(source.filename);\n}\n\nexport function* autodetect(source: Source): Iterable<Source> {\n\tif (isVue(source)) {\n\t\tyield* transformSFC(source);\n\t} else if (isJavascript(source)) {\n\t\tyield* transformJS(source);\n\t} else {\n\t\tyield* transformHTML(source);\n\t}\n}\n\nautodetect.api = 1;\n", "import { type Transformer } from \"html-validate\";\nimport { autodetect } from \"./auto.transform\";\nimport { transformHTML } from \"./html.transform\";\nimport { transformJS } from \"./js.transform\";\nimport { transformSFC } from \"./sfc.transform\";\n\nconst transformer: Record<string, Transformer> = {\n\tdefault: autodetect,\n\tauto: autodetect,\n\tjs: transformJS,\n\tsfc: transformSFC,\n\thtml: transformHTML,\n};\n\nexport default transformer;\n", "/* istanbul ignore file */\n\nimport plugin from \"./index\";\n\nexport default plugin;\n"],
5
+ "mappings": "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",
6
+ "names": ["Rule", "walk", "Rule", "walk", "Rule", "Rule", "walk", "difference", "Rule", "walk", "DynamicValue", "DynamicValue", "meta", "name", "DynamicValue", "common"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "html-validate-vue",
3
- "version": "7.3.1",
3
+ "version": "7.4.1",
4
4
  "description": "vue transform for html-validate",
5
5
  "keywords": [
6
6
  "html",
@@ -36,10 +36,10 @@
36
36
  "dist"
37
37
  ],
38
38
  "dependencies": {
39
- "@html-validate/plugin-utils": "2.1.0"
39
+ "@html-validate/plugin-utils": "2.2.0"
40
40
  },
41
41
  "peerDependencies": {
42
- "html-validate": "^8.10.0 || ^9.0.0 || ^10.0.0"
42
+ "html-validate": "^8.21.0 || ^9.0.0 || ^10.0.0"
43
43
  },
44
44
  "engines": {
45
45
  "node": ">= 18.0"