html-validate 11.1.0 → 11.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/cjs/cli.js +7 -1
  2. package/dist/cjs/cli.js.map +1 -1
  3. package/dist/cjs/core.js +95 -17
  4. package/dist/cjs/core.js.map +1 -1
  5. package/dist/cjs/elements.js +16 -2
  6. package/dist/cjs/elements.js.map +1 -1
  7. package/dist/cjs/index.js +1 -0
  8. package/dist/cjs/index.js.map +1 -1
  9. package/dist/cjs/{matchers.js → jest-matchers.js} +66 -38
  10. package/dist/cjs/jest-matchers.js.map +1 -0
  11. package/dist/cjs/{matcher-utils.js → jest-utils.js} +1 -8
  12. package/dist/cjs/jest-utils.js.map +1 -0
  13. package/dist/cjs/jest-worker.js.map +1 -1
  14. package/dist/cjs/jest.js +10 -13
  15. package/dist/cjs/jest.js.map +1 -1
  16. package/dist/cjs/vitest-matchers.js +281 -0
  17. package/dist/cjs/vitest-matchers.js.map +1 -0
  18. package/dist/cjs/vitest-utils.js +120 -0
  19. package/dist/cjs/vitest-utils.js.map +1 -0
  20. package/dist/cjs/vitest-worker.d.ts +1 -0
  21. package/dist/cjs/vitest-worker.js +63 -0
  22. package/dist/cjs/vitest-worker.js.map +1 -0
  23. package/dist/cjs/vitest.js +9 -7
  24. package/dist/cjs/vitest.js.map +1 -1
  25. package/dist/esm/browser.js +1 -1
  26. package/dist/esm/cli.js +9 -3
  27. package/dist/esm/cli.js.map +1 -1
  28. package/dist/esm/core-browser.js +1 -1
  29. package/dist/esm/core-nodejs.js +1 -1
  30. package/dist/esm/core.js +94 -17
  31. package/dist/esm/core.js.map +1 -1
  32. package/dist/esm/elements.js +16 -2
  33. package/dist/esm/elements.js.map +1 -1
  34. package/dist/esm/html-validate.js +2 -2
  35. package/dist/esm/index.js +2 -1
  36. package/dist/esm/index.js.map +1 -1
  37. package/dist/esm/jest-matchers.js +263 -0
  38. package/dist/esm/jest-matchers.js.map +1 -0
  39. package/dist/esm/{matcher-utils.js → jest-utils.js} +3 -9
  40. package/dist/esm/jest-utils.js.map +1 -0
  41. package/dist/esm/jest-worker.js.map +1 -1
  42. package/dist/esm/jest.js +6 -9
  43. package/dist/esm/jest.js.map +1 -1
  44. package/dist/esm/{matchers.js → vitest-matchers.js} +62 -45
  45. package/dist/esm/vitest-matchers.js.map +1 -0
  46. package/dist/esm/vitest-utils.js +116 -0
  47. package/dist/esm/vitest-utils.js.map +1 -0
  48. package/dist/esm/vitest-worker.d.ts +1 -0
  49. package/dist/esm/vitest-worker.js +62 -0
  50. package/dist/esm/vitest-worker.js.map +1 -0
  51. package/dist/esm/vitest.js +9 -7
  52. package/dist/esm/vitest.js.map +1 -1
  53. package/dist/types/browser.d.ts +13 -0
  54. package/dist/types/index.d.ts +13 -0
  55. package/dist/types/vitest.d.ts +18 -0
  56. package/package.json +5 -5
  57. package/dist/cjs/jest-diff.js +0 -41
  58. package/dist/cjs/jest-diff.js.map +0 -1
  59. package/dist/cjs/matcher-utils.js.map +0 -1
  60. package/dist/cjs/matchers-jestonly.js +0 -44
  61. package/dist/cjs/matchers-jestonly.js.map +0 -1
  62. package/dist/cjs/matchers.js.map +0 -1
  63. package/dist/esm/jest-diff.js +0 -20
  64. package/dist/esm/jest-diff.js.map +0 -1
  65. package/dist/esm/matcher-utils.js.map +0 -1
  66. package/dist/esm/matchers-jestonly.js +0 -41
  67. package/dist/esm/matchers-jestonly.js.map +0 -1
  68. package/dist/esm/matchers.js.map +0 -1
@@ -1,7 +1,9 @@
1
- import { d as diverge, c as createSyncFn, f as flattenMessages } from './matcher-utils.js';
2
- import { l as deepmerge, a2 as workerPath } from './core.js';
1
+ import { d as diverge, a as createSyncFn, c as codeframe } from './vitest-utils.js';
2
+ import { v as deepmerge, a4 as vitestWorkerPath } from './core.js';
3
+ import * as vitest from 'vitest';
4
+ import { H as HtmlValidate } from './core-nodejs.js';
3
5
 
4
- function createMatcher$4() {
6
+ function createMatcher$6() {
5
7
  function toBeValid(report) {
6
8
  if (report.valid) {
7
9
  return {
@@ -22,7 +24,7 @@ function createMatcher$4() {
22
24
  return diverge(toBeValid);
23
25
  }
24
26
 
25
- function createMatcher$3() {
27
+ function createMatcher$5() {
26
28
  function toBeInvalid(report) {
27
29
  if (report.valid) {
28
30
  return {
@@ -77,17 +79,17 @@ function getMarkup(src) {
77
79
  throw new TypeError(`Failed to get markup from "${typeof src}" argument`);
78
80
  }
79
81
  }
80
- function createMatcher$2(expect, diff) {
82
+ function createMatcher$4(expect) {
81
83
  function toHTMLValidate(actual, arg0, arg1, arg2) {
82
84
  const markup = getMarkup(actual);
83
85
  const message = isMessage(arg0) ? arg0 : void 0;
84
86
  const config = isConfig(arg0) ? arg0 : isConfig(arg1) ? arg1 : void 0;
85
87
  const filename = isString(arg0) ? arg0 : isString(arg1) ? arg1 : arg2;
86
- return toHTMLValidateImpl.call(this, expect, diff, markup, message, config, filename);
88
+ return toHTMLValidateImpl.call(this, expect, markup, message, config, filename);
87
89
  }
88
90
  return diverge(toHTMLValidate);
89
91
  }
90
- function toHTMLValidateImpl(expect, diff, actual, expectedError, userConfig, filename) {
92
+ function toHTMLValidateImpl(expect, actual, expectedError, userConfig, filename) {
91
93
  const defaultConfig = {
92
94
  rules: {
93
95
  /* jsdom normalizes style so disabling rule when using this matcher or it
@@ -97,7 +99,7 @@ function toHTMLValidateImpl(expect, diff, actual, expectedError, userConfig, fil
97
99
  };
98
100
  const config = deepmerge(defaultConfig, userConfig ?? {});
99
101
  const actualFilename = filename ?? this.testPath ?? "inline";
100
- const syncFn = createSyncFn(workerPath);
102
+ const syncFn = createSyncFn(vitestWorkerPath);
101
103
  const report = syncFn(actual, actualFilename, config);
102
104
  const pass = report.valid;
103
105
  const result = report.results[0];
@@ -108,14 +110,10 @@ function toHTMLValidateImpl(expect, diff, actual, expectedError, userConfig, fil
108
110
  const actual2 = result.messages;
109
111
  const expected = expect.arrayContaining([expect.objectContaining(expectedError)]);
110
112
  const errorPass = this.equals(actual2, expected);
111
- const diffString = diff ? diff(expected, actual2, {
112
- expand: this.expand,
113
+ const diffString = this.utils.diff(expected, actual2, {
113
114
  aAnnotation: "Expected error",
114
115
  bAnnotation: "Actual error"
115
- }) : (
116
- /* istanbul ignore next */
117
- void 0
118
- );
116
+ });
119
117
  const hint = this.utils.matcherHint(".not.toHTMLValidate", void 0, void 0, {
120
118
  comment: "expected error"
121
119
  });
@@ -138,14 +136,11 @@ ${diffString}` : ""
138
136
  }
139
137
  }
140
138
 
141
- function toHaveErrorImpl(context, expect, diff, actual, expected) {
142
- const flattened = flattenMessages(actual);
139
+ function toHaveErrorImpl(context, expect, actual, expected) {
140
+ const flattened = actual.results.flatMap((result) => result.messages);
143
141
  const matcher = [expect.objectContaining(expected)];
144
142
  const pass = context.equals(flattened, matcher);
145
- const diffString = diff ? diff(matcher, flattened, { expand: context.expand }) : (
146
- /* istanbul ignore next */
147
- void 0
148
- );
143
+ const diffString = context.utils.diff(matcher, flattened);
149
144
  const hint = context.utils.matcherHint(".toHaveError");
150
145
  const prettyExpected = context.utils.printExpected(matcher);
151
146
  const prettyReceived = context.utils.printReceived(flattened);
@@ -166,27 +161,27 @@ ${diffString}` : ""
166
161
  };
167
162
  return { pass, message: resultMessage, actual: flattened, expected: matcher };
168
163
  }
169
- function createMatcher$1(expect, diff) {
164
+ function createMatcher$3(expect) {
170
165
  function toHaveError(actual, arg1, arg2, arg3) {
171
166
  if (typeof arg1 === "string") {
172
167
  const expected = {
173
168
  ruleId: arg1,
174
169
  message: arg2
175
170
  };
176
- if (arg3) {
171
+ if (arg3 !== void 0) {
177
172
  expected.context = arg3;
178
173
  }
179
- return toHaveErrorImpl(this, expect, diff, actual, expected);
174
+ return toHaveErrorImpl(this, expect, actual, expected);
180
175
  } else {
181
- return toHaveErrorImpl(this, expect, diff, actual, arg1);
176
+ return toHaveErrorImpl(this, expect, actual, arg1);
182
177
  }
183
178
  }
184
179
  return diverge(toHaveError);
185
180
  }
186
181
 
187
- function createMatcher(expect, diff) {
182
+ function createMatcher$2(expect) {
188
183
  function toHaveErrors(report, errors) {
189
- const flattened = flattenMessages(report);
184
+ const flattened = report.results.flatMap((result) => result.messages);
190
185
  const matcher = errors.map((entry) => {
191
186
  if (Array.isArray(entry)) {
192
187
  const [ruleId, message] = entry;
@@ -196,10 +191,7 @@ function createMatcher(expect, diff) {
196
191
  }
197
192
  });
198
193
  const pass = this.equals(flattened, matcher);
199
- const diffString = diff ? diff(matcher, flattened, { expand: this.expand }) : (
200
- /* istanbul ignore next */
201
- void 0
202
- );
194
+ const diffString = this.utils.diff(matcher, flattened);
203
195
  const resultMessage = () => this.utils.matcherHint(".toHaveErrors") + `
204
196
 
205
197
  Expected error to equal:
@@ -216,21 +208,46 @@ ${diffString}` : "");
216
208
  return diverge(toHaveErrors);
217
209
  }
218
210
 
219
- function getResults(filename, value) {
220
- if (typeof value === "string") {
221
- const syncFn = createSyncFn(workerPath);
222
- const report = syncFn(value, filename, {
223
- rules: {
224
- "void-style": "off"
225
- }
226
- });
227
- return report.results.map((it) => {
228
- return { ...it, filePath: "inline" };
229
- });
230
- } else {
231
- return value.results;
211
+ function createMatcher$1() {
212
+ const htmlvalidate = new HtmlValidate();
213
+ async function toMatchCodeframe(received, hint) {
214
+ if (!vitest.Snapshots) {
215
+ throw new Error("toMatchCodeframe() requires vitest 4.1.3 or later. Please upgrade vitest.");
216
+ }
217
+ const resolved = await received;
218
+ let report;
219
+ if (typeof resolved === "string") {
220
+ report = await htmlvalidate.validateString(resolved);
221
+ } else {
222
+ report = resolved;
223
+ }
224
+ const snapshot = codeframe(report.results).replaceAll(/\s+$/gm, "");
225
+ return vitest.Snapshots.toMatchSnapshot.call(this, snapshot, hint);
226
+ }
227
+ return toMatchCodeframe;
228
+ }
229
+
230
+ function createMatcher() {
231
+ const htmlvalidate = new HtmlValidate();
232
+ async function toMatchInlineCodeframe(received, inlineSnapshot) {
233
+ if (!vitest.Snapshots) {
234
+ throw new Error(
235
+ "toMatchInlineCodeframe() requires vitest 4.1.3 or later. Please upgrade vitest."
236
+ );
237
+ }
238
+ vitest.chai.util.flag(this.assertion, "error", new Error("stacktrace"));
239
+ const resolved = await received;
240
+ let report;
241
+ if (typeof resolved === "string") {
242
+ report = await htmlvalidate.validateString(resolved);
243
+ } else {
244
+ report = resolved;
245
+ }
246
+ const snapshot = codeframe(report.results).replaceAll(/\s+$/gm, "");
247
+ return vitest.Snapshots.toMatchInlineSnapshot.call(this, snapshot, inlineSnapshot);
232
248
  }
249
+ return toMatchInlineCodeframe;
233
250
  }
234
251
 
235
- export { createMatcher$1 as a, createMatcher$2 as b, createMatcher as c, createMatcher$3 as d, createMatcher$4 as e, getResults as g };
236
- //# sourceMappingURL=matchers.js.map
252
+ export { createMatcher$1 as a, createMatcher$2 as b, createMatcher as c, createMatcher$3 as d, createMatcher$4 as e, createMatcher$5 as f, createMatcher$6 as g };
253
+ //# sourceMappingURL=vitest-matchers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-matchers.js","sources":["../../src/vitest/matchers/to-be-valid.ts","../../src/vitest/matchers/to-be-invalid.ts","../../src/vitest/matchers/to-htmlvalidate.ts","../../src/vitest/matchers/to-have-error.ts","../../src/vitest/matchers/to-have-errors.ts","../../src/vitest/matchers/to-match-codeframe.ts","../../src/vitest/matchers/to-match-inline-codeframe.ts"],"sourcesContent":["import { type SyncExpectationResult } from \"@vitest/expect\";\nimport { type Report } from \"../../reporter\";\nimport { type MaybeAsyncCallback, diverge } from \"../utils\";\n\nfunction createMatcher(): MaybeAsyncCallback<Report, []> {\n\tfunction toBeValid(report: Report): SyncExpectationResult {\n\t\tif (report.valid) {\n\t\t\treturn {\n\t\t\t\tpass: true,\n\t\t\t\tmessage: /* istanbul ignore next */ () => \"Result should not contain error\",\n\t\t\t};\n\t\t} else {\n\t\t\tconst firstError = report.results[0].messages[0];\n\t\t\treturn {\n\t\t\t\tpass: false,\n\t\t\t\tmessage: () => `Result should be valid but had error \"${firstError.message}\"`,\n\t\t\t};\n\t\t}\n\t}\n\treturn diverge(toBeValid);\n}\n\nexport { createMatcher as toBeValid };\n","import { type SyncExpectationResult } from \"@vitest/expect\";\nimport { type Report } from \"../../reporter\";\nimport { type MaybeAsyncCallback, diverge } from \"../utils\";\n\nfunction createMatcher(): MaybeAsyncCallback<Report, []> {\n\tfunction toBeInvalid(report: Report): SyncExpectationResult {\n\t\tif (report.valid) {\n\t\t\treturn {\n\t\t\t\tpass: false,\n\t\t\t\tmessage: () => \"Result should be invalid but had no errors\",\n\t\t\t};\n\t\t} else {\n\t\t\treturn {\n\t\t\t\tpass: true,\n\t\t\t\tmessage: /* istanbul ignore next */ () => \"Result should not contain error\",\n\t\t\t};\n\t\t}\n\t}\n\treturn diverge(toBeInvalid);\n}\n\nexport { createMatcher as toBeInvalid };\n","import { type MatcherState, type SyncExpectationResult } from \"@vitest/expect\";\nimport deepmerge from \"deepmerge\";\nimport { type expect } from \"vitest\";\nimport { type ConfigData } from \"../../config\";\nimport { type Message } from \"../../message\";\nimport { type MaybeAsyncCallback, diverge } from \"../utils\";\nimport { type ValidateStringFn, createSyncFn, vitestWorkerPath } from \"../worker\";\n\ntype VitestExpect = typeof expect;\n\nfunction isMessage(arg: Arg1 | undefined): arg is Partial<Message> {\n\tif (!arg || typeof arg !== \"object\") {\n\t\treturn false;\n\t}\n\treturn [\n\t\t\"ruleId\",\n\t\t\"severity\",\n\t\t\"message\",\n\t\t\"offset\",\n\t\t\"line\",\n\t\t\"column\",\n\t\t\"size\",\n\t\t\"selector\",\n\t\t\"context\",\n\t].some((key) => key in arg);\n}\n\nfunction isConfig(arg: Arg1 | undefined): arg is ConfigData {\n\tif (!arg || typeof arg !== \"object\") {\n\t\treturn false;\n\t}\n\treturn [\"root\", \"extends\", \"elements\", \"plugin\", \"transform\", \"rules\"].some((key) => key in arg);\n}\n\nfunction isString(arg: Arg1 | undefined): arg is string {\n\treturn typeof arg === \"string\";\n}\n\nfunction getMarkup(src: unknown): string {\n\tif (typeof HTMLElement !== \"undefined\" && src instanceof HTMLElement) {\n\t\treturn (src as { outerHTML: string }).outerHTML;\n\t}\n\t/* istanbul ignore else: prototype only allows string or HTMLElement */\n\tif (typeof src === \"string\") {\n\t\treturn src;\n\t} else {\n\t\tthrow new TypeError(`Failed to get markup from \"${typeof src}\" argument`);\n\t}\n}\n\ntype Arg1 = Partial<Message> | ConfigData | string;\ntype Arg2 = ConfigData | string;\ntype Arg3 = string;\n\nfunction createMatcher(expect: VitestExpect): MaybeAsyncCallback<unknown, [Arg1?, Arg2?, Arg3?]> {\n\tfunction toHTMLValidate(\n\t\tthis: MatcherState,\n\t\tactual: unknown,\n\t\targ0?: Arg1,\n\t\targ1?: Arg2,\n\t\targ2?: Arg3,\n\t): SyncExpectationResult {\n\t\tconst markup = getMarkup(actual);\n\t\tconst message = isMessage(arg0) ? arg0 : undefined;\n\t\tconst config = isConfig(arg0) ? arg0 : isConfig(arg1) ? arg1 : undefined; // eslint-disable-line sonarjs/no-nested-conditional -- easier to read than the alternative */\n\t\tconst filename = isString(arg0) ? arg0 : isString(arg1) ? arg1 : arg2; // eslint-disable-line sonarjs/no-nested-conditional -- easier to read than the alternative */\n\t\treturn toHTMLValidateImpl.call(this, expect, markup, message, config, filename);\n\t}\n\treturn diverge(toHTMLValidate);\n}\n\n/* eslint-disable-next-line @typescript-eslint/max-params -- technical debt */\nfunction toHTMLValidateImpl(\n\tthis: MatcherState,\n\texpect: VitestExpect,\n\tactual: string,\n\texpectedError?: Partial<Message>,\n\tuserConfig?: ConfigData,\n\tfilename?: string,\n): SyncExpectationResult {\n\tconst defaultConfig = {\n\t\trules: {\n\t\t\t/* jsdom normalizes style so disabling rule when using this matcher or it\n\t\t\t * gets quite noisy when configured with self-closing */\n\t\t\t\"void-style\": \"off\",\n\t\t},\n\t};\n\tconst config = deepmerge(defaultConfig, userConfig ?? {});\n\t/* istanbul ignore next: cant figure out when this would be unset */\n\tconst actualFilename = filename ?? this.testPath ?? \"inline\";\n\n\tconst syncFn = createSyncFn<ValidateStringFn>(vitestWorkerPath);\n\tconst report = syncFn(actual, actualFilename, config);\n\tconst pass = report.valid;\n\tconst result = report.results[0];\n\tif (pass) {\n\t\treturn { pass, message: () => \"HTML is valid when an error was expected\" };\n\t} else {\n\t\tif (expectedError) {\n\t\t\tconst actual = result.messages;\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- upstream typing */\n\t\t\tconst expected = expect.arrayContaining([expect.objectContaining(expectedError)]);\n\t\t\tconst errorPass = this.equals(actual, expected);\n\t\t\tconst diffString = this.utils.diff(expected, actual, {\n\t\t\t\taAnnotation: \"Expected error\",\n\t\t\t\tbAnnotation: \"Actual error\",\n\t\t\t});\n\t\t\tconst hint = this.utils.matcherHint(\".not.toHTMLValidate\", undefined, undefined, {\n\t\t\t\tcomment: \"expected error\",\n\t\t\t});\n\t\t\tconst expectedErrorMessage = (): string =>\n\t\t\t\t[\n\t\t\t\t\thint,\n\t\t\t\t\t\"\",\n\t\t\t\t\t\"Expected error to be present:\",\n\t\t\t\t\tthis.utils.printExpected(expectedError),\n\t\t\t\t\t/* istanbul ignore next */ diffString ? `\\n${diffString}` : \"\",\n\t\t\t\t].join(\"\\n\");\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- upstream typing */\n\t\t\treturn { pass: !errorPass, message: expectedErrorMessage, actual, expected };\n\t\t}\n\n\t\tconst errors = result.messages.map((message) => ` ${message.message} [${message.ruleId}]`);\n\t\treturn {\n\t\t\tpass,\n\t\t\tmessage: () =>\n\t\t\t\t[\"Expected HTML to be valid but had the following errors:\", \"\"].concat(errors).join(\"\\n\"),\n\t\t};\n\t}\n}\n\nexport { createMatcher as toHTMLValidate };\n","import { type MatcherState, type SyncExpectationResult } from \"@vitest/expect\";\nimport { type expect } from \"vitest\";\nimport { type Message } from \"../../message\";\nimport { type Report } from \"../../reporter\";\nimport { type MaybeAsyncCallback, diverge } from \"../utils\";\n\ntype VitestExpect = typeof expect;\n\nfunction toHaveErrorImpl(\n\tcontext: MatcherState,\n\texpect: VitestExpect,\n\tactual: Report,\n\texpected: Partial<Message>,\n): SyncExpectationResult {\n\tconst flattened = actual.results.flatMap((result) => result.messages);\n\tconst matcher = [expect.objectContaining(expected)];\n\tconst pass = context.equals(flattened, matcher);\n\tconst diffString = context.utils.diff(matcher, flattened);\n\tconst hint = context.utils.matcherHint(\".toHaveError\");\n\tconst prettyExpected = context.utils.printExpected(matcher);\n\tconst prettyReceived = context.utils.printReceived(flattened);\n\tconst resultMessage = (): string => {\n\t\treturn [\n\t\t\thint,\n\t\t\t\"\",\n\t\t\t\"Expected error to equal:\",\n\t\t\t` ${prettyExpected}`,\n\t\t\t\"Received:\",\n\t\t\t` ${prettyReceived}`,\n\t\t\t/* istanbul ignore next */ diffString ? `\\nDifference:\\n\\n${diffString}` : \"\",\n\t\t].join(\"\\n\");\n\t};\n\treturn { pass, message: resultMessage, actual: flattened, expected: matcher };\n}\n\nfunction createMatcher(\n\texpect: VitestExpect,\n):\n\t| MaybeAsyncCallback<Report, [Partial<Message>]>\n\t| MaybeAsyncCallback<Report, [string, string, unknown?]> {\n\tfunction toHaveError(\n\t\tthis: MatcherState,\n\t\tactual: Report,\n\t\terror: Partial<Message>,\n\t): SyncExpectationResult;\n\tfunction toHaveError(\n\t\tthis: MatcherState,\n\t\tactual: Report,\n\t\truleId: string,\n\t\tmessage: string,\n\t\tcontext?: unknown,\n\t): SyncExpectationResult;\n\tfunction toHaveError(\n\t\tthis: MatcherState,\n\t\tactual: Report,\n\t\targ1: string | Partial<Message>,\n\t\targ2?: string,\n\t\targ3?: unknown,\n\t): SyncExpectationResult {\n\t\tif (typeof arg1 === \"string\") {\n\t\t\tconst expected: Partial<Message> = {\n\t\t\t\truleId: arg1,\n\t\t\t\tmessage: arg2,\n\t\t\t};\n\t\t\tif (arg3 !== undefined) {\n\t\t\t\texpected.context = arg3;\n\t\t\t}\n\t\t\treturn toHaveErrorImpl(this, expect, actual, expected);\n\t\t} else {\n\t\t\treturn toHaveErrorImpl(this, expect, actual, arg1);\n\t\t}\n\t}\n\treturn diverge(toHaveError);\n}\n\nexport { createMatcher as toHaveError };\n","/* eslint-disable prefer-template -- technical debt, should be refactored */\n\nimport { type MatcherState, type SyncExpectationResult } from \"@vitest/expect\";\nimport { type expect } from \"vitest\";\nimport { type Report } from \"../../reporter\";\nimport { type MaybeAsyncCallback, diverge } from \"../utils\";\n\ntype VitestExpect = typeof expect;\n\nfunction createMatcher(\n\texpect: VitestExpect,\n): MaybeAsyncCallback<Report, [Array<[string, string] | Record<string, unknown>>]> {\n\tfunction toHaveErrors(\n\t\tthis: MatcherState,\n\t\treport: Report,\n\t\terrors: Array<[string, string] | Record<string, unknown>>,\n\t): SyncExpectationResult {\n\t\tconst flattened = report.results.flatMap((result) => result.messages);\n\t\tconst matcher = errors.map((entry) => {\n\t\t\tif (Array.isArray(entry)) {\n\t\t\t\tconst [ruleId, message] = entry;\n\t\t\t\t/* eslint-disable-next-line @typescript-eslint/no-unsafe-return -- upstream typing */\n\t\t\t\treturn expect.objectContaining({ ruleId, message });\n\t\t\t} else {\n\t\t\t\t/* eslint-disable-next-line @typescript-eslint/no-unsafe-return -- upstream typing */\n\t\t\t\treturn expect.objectContaining(entry);\n\t\t\t}\n\t\t});\n\t\tconst pass = this.equals(flattened, matcher);\n\t\tconst diffString = this.utils.diff(matcher, flattened);\n\t\tconst resultMessage = (): string =>\n\t\t\tthis.utils.matcherHint(\".toHaveErrors\") +\n\t\t\t\"\\n\\n\" +\n\t\t\t\"Expected error to equal:\\n\" +\n\t\t\t` ${this.utils.printExpected(matcher)}\\n` +\n\t\t\t\"Received:\\n\" +\n\t\t\t` ${this.utils.printReceived(flattened)}` +\n\t\t\t/* istanbul ignore next */ (diffString ? `\\n\\nDifference:\\n\\n${diffString}` : \"\");\n\n\t\treturn { pass, message: resultMessage };\n\t}\n\treturn diverge(toHaveErrors);\n}\n\nexport { createMatcher as toHaveErrors };\n","import { type AsyncExpectationResult, type MatcherState } from \"@vitest/expect\";\nimport * as vitest from \"vitest\";\nimport { HtmlValidate } from \"../../htmlvalidate\";\nimport { type Report } from \"../../reporter\";\nimport { codeframe } from \"../utils\";\n\ntype ToMatchCodeframeMatcher = (\n\tthis: MatcherState,\n\treceived: Report | string | Promise<Report> | Promise<string>,\n\thint?: string,\n) => AsyncExpectationResult;\n\nfunction createMatcher(): ToMatchCodeframeMatcher {\n\tconst htmlvalidate = new HtmlValidate();\n\n\tasync function toMatchCodeframe(\n\t\tthis: MatcherState,\n\t\treceived: Report | string | Promise<Report> | Promise<string>,\n\t\thint?: string,\n\t): AsyncExpectationResult {\n\t\t/* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- for backwards compatibility with older vitest versions */\n\t\tif (!vitest.Snapshots) {\n\t\t\tthrow new Error(\"toMatchCodeframe() requires vitest 4.1.3 or later. Please upgrade vitest.\");\n\t\t}\n\n\t\tconst resolved = await received;\n\n\t\tlet report: Report;\n\t\tif (typeof resolved === \"string\") {\n\t\t\treport = await htmlvalidate.validateString(resolved);\n\t\t} else {\n\t\t\treport = resolved;\n\t\t}\n\n\t\tconst snapshot = codeframe(report.results).replaceAll(/\\s+$/gm, \"\");\n\n\t\treturn vitest.Snapshots.toMatchSnapshot.call(this, snapshot, hint);\n\t}\n\n\treturn toMatchCodeframe;\n}\n\nexport { createMatcher as toMatchCodeframe };\n","import { type AsyncExpectationResult, type MatcherState } from \"@vitest/expect\";\nimport * as vitest from \"vitest\";\nimport { HtmlValidate } from \"../../htmlvalidate\";\nimport { type Report } from \"../../reporter\";\nimport { codeframe } from \"../utils\";\n\ntype ToMatchInlineCodeframeMatcher = (\n\tthis: MatcherState,\n\treceived: Report | string | Promise<Report> | Promise<string>,\n\tinlineSnapshot?: string,\n) => AsyncExpectationResult;\n\nfunction createMatcher(): ToMatchInlineCodeframeMatcher {\n\tconst htmlvalidate = new HtmlValidate();\n\n\tasync function toMatchInlineCodeframe(\n\t\tthis: MatcherState,\n\t\treceived: Report | string | Promise<Report> | Promise<string>,\n\t\tinlineSnapshot?: string,\n\t): AsyncExpectationResult {\n\t\t/* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- for backwards compatibility with older vitest versions */\n\t\tif (!vitest.Snapshots) {\n\t\t\tthrow new Error(\n\t\t\t\t\"toMatchInlineCodeframe() requires vitest 4.1.3 or later. Please upgrade vitest.\",\n\t\t\t);\n\t\t}\n\n\t\t/* Capture the call site synchronously before any await — vitest needs this\n\t\t * to determine where to rewrite the inline snapshot in the source file. */\n\t\tvitest.chai.util.flag(this.assertion, \"error\", new Error(\"stacktrace\"));\n\n\t\tconst resolved = await received;\n\n\t\tlet report: Report;\n\t\tif (typeof resolved === \"string\") {\n\t\t\treport = await htmlvalidate.validateString(resolved);\n\t\t} else {\n\t\t\treport = resolved;\n\t\t}\n\n\t\tconst snapshot = codeframe(report.results).replaceAll(/\\s+$/gm, \"\");\n\n\t\treturn vitest.Snapshots.toMatchInlineSnapshot.call(this, snapshot, inlineSnapshot);\n\t}\n\n\treturn toMatchInlineCodeframe;\n}\n\nexport { createMatcher as toMatchInlineCodeframe };\n"],"names":["createMatcher","actual"],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ import { s as codeFrameColumns, B as getEndLocation, G as getStartLocation } from './core.js';
2
+ import { MessageChannel, Worker, receiveMessageOnPort } from 'node:worker_threads';
3
+ import { l as legacyRequire } from './core-nodejs.js';
4
+
5
+ function formatMessage(message, parentResult) {
6
+ const type = message.severity === 2 ? "error" : "warning";
7
+ const msg = message.message.replace(/([^ ])\.$/, "$1");
8
+ const ruleId = `(${message.ruleId})`;
9
+ const sourceCode = parentResult.source;
10
+ const firstLine = [`${type}:`, msg, ruleId].join(" ");
11
+ const result = [firstLine];
12
+ if (sourceCode) {
13
+ const output = codeFrameColumns(sourceCode, {
14
+ start: getStartLocation(message),
15
+ end: getEndLocation(message, sourceCode)
16
+ });
17
+ result.push(output);
18
+ }
19
+ result.push(`Selector: ${message.selector ?? "-"}`);
20
+ return result.join("\n");
21
+ }
22
+ function codeframe(results) {
23
+ let errors = 0;
24
+ let warnings = 0;
25
+ const resultsWithMessages = results.filter((result) => result.messages.length > 0);
26
+ const output = resultsWithMessages.reduce((resultsOutput, result) => {
27
+ const messages = result.messages.map((message) => {
28
+ return `${formatMessage(message, result)}
29
+
30
+ `;
31
+ });
32
+ errors += result.errorCount;
33
+ warnings += result.warningCount;
34
+ return resultsOutput.concat(messages);
35
+ }, []).join("\n");
36
+ return errors + warnings > 0 ? output : "";
37
+ }
38
+
39
+ function isThenable(value) {
40
+ return value && typeof value === "object" && "then" in value && typeof value.then === "function";
41
+ }
42
+
43
+ function diverge(fn) {
44
+ function diverged(actual, ...args) {
45
+ if (isThenable(actual)) {
46
+ return actual.then((resolved) => fn.call(this, resolved, ...args));
47
+ } else {
48
+ return fn.call(this, actual, ...args);
49
+ }
50
+ }
51
+ return diverged;
52
+ }
53
+
54
+ const INT32_BYTES = 4;
55
+ const syncFnCache = /* @__PURE__ */ new Map();
56
+ const sharedBuffer = new SharedArrayBuffer(INT32_BYTES);
57
+ const sharedBufferView = new Int32Array(sharedBuffer, 0, 1);
58
+ function isWorkerError(value) {
59
+ return "error" in value;
60
+ }
61
+ function receiveMessageWithId(port, expectedId) {
62
+ const timeout = 3e4;
63
+ const status = Atomics.wait(sharedBufferView, 0, 0, timeout);
64
+ Atomics.store(sharedBufferView, 0, 0);
65
+ if (!["ok", "not-equal"].includes(status)) {
66
+ const abortMsg = {
67
+ id: expectedId,
68
+ cmd: "abort"
69
+ };
70
+ port.postMessage(abortMsg);
71
+ throw new Error(`Internal error: Atomics.wait() failed: ${status}`);
72
+ }
73
+ const reply = receiveMessageOnPort(port);
74
+ const { id, ...message } = reply.message;
75
+ if (id < expectedId) {
76
+ return receiveMessageWithId(port, expectedId);
77
+ }
78
+ if (expectedId !== id) {
79
+ throw new Error(`Internal error: Expected id ${String(expectedId)} but got id ${String(id)}`);
80
+ }
81
+ return { id, ...message };
82
+ }
83
+ function startWorkerThread(workerPath) {
84
+ const { port1: mainPort, port2: workerPort } = new MessageChannel();
85
+ const workerPathUrl = legacyRequire.resolve(workerPath);
86
+ const worker = new Worker(workerPathUrl, {
87
+ eval: false,
88
+ workerData: { sharedBuffer, workerPort },
89
+ transferList: [workerPort]
90
+ });
91
+ let nextID = 0;
92
+ const syncFn = (...args) => {
93
+ const id = nextID++;
94
+ const msg = { id, args };
95
+ worker.postMessage(msg);
96
+ const reply = receiveMessageWithId(mainPort, id);
97
+ if (isWorkerError(reply)) {
98
+ throw new Error(reply.error);
99
+ }
100
+ return reply.result;
101
+ };
102
+ worker.unref();
103
+ return syncFn;
104
+ }
105
+ function createSyncFn(workerPath) {
106
+ const cachedSyncFn = syncFnCache.get(workerPath);
107
+ if (cachedSyncFn) {
108
+ return cachedSyncFn;
109
+ }
110
+ const syncFn = startWorkerThread(workerPath);
111
+ syncFnCache.set(workerPath, syncFn);
112
+ return syncFn;
113
+ }
114
+
115
+ export { createSyncFn as a, codeframe as c, diverge as d };
116
+ //# sourceMappingURL=vitest-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-utils.js","sources":["../../src/vitest/utils/codeframe.ts","../../src/vitest/utils/is-thenable.ts","../../src/vitest/utils/diverge.ts","../../src/vitest/worker/create-sync-fn.ts"],"sourcesContent":["import { type Message } from \"../../message\";\nimport { type Result } from \"../../reporter\";\nimport { codeFrameColumns } from \"../../utils/code-frame-columns\";\nimport { getEndLocation, getStartLocation } from \"../../utils/message-location\";\n\n/**\n * Gets the formatted output for a given message.\n * @param message - The object that represents this message.\n * @param parentResult - The result object that this message belongs to.\n * @returns The formatted output.\n */\nfunction formatMessage(message: Message, parentResult: Result): string {\n\tconst type = message.severity === 2 ? \"error\" : \"warning\";\n\tconst msg = message.message.replace(/([^ ])\\.$/, \"$1\");\n\tconst ruleId = `(${message.ruleId})`;\n\tconst sourceCode = parentResult.source;\n\tconst firstLine = [`${type}:`, msg, ruleId].join(\" \");\n\tconst result = [firstLine];\n\n\t/* istanbul ignore next: safety check from original implementation */\n\tif (sourceCode) {\n\t\tconst output = codeFrameColumns(sourceCode, {\n\t\t\tstart: getStartLocation(message),\n\t\t\tend: getEndLocation(message, sourceCode),\n\t\t});\n\t\tresult.push(output);\n\t}\n\n\tresult.push(`Selector: ${message.selector ?? \"-\"}`);\n\n\treturn result.join(\"\\n\");\n}\n\n/**\n * Codeframe formatter based on ESLint codeframe.\n *\n * @internal\n */\nexport function codeframe(results: Result[]): string {\n\tlet errors = 0;\n\tlet warnings = 0;\n\n\tconst resultsWithMessages = results.filter((result) => result.messages.length > 0);\n\n\tconst output = resultsWithMessages\n\t\t.reduce<string[]>((resultsOutput, result) => {\n\t\t\tconst messages = result.messages.map((message) => {\n\t\t\t\treturn `${formatMessage(message, result)}\\n\\n`;\n\t\t\t});\n\n\t\t\terrors += result.errorCount;\n\t\t\twarnings += result.warningCount;\n\n\t\t\treturn resultsOutput.concat(messages);\n\t\t}, [])\n\t\t.join(\"\\n\");\n\n\treturn errors + warnings > 0 ? output : \"\";\n}\n","/**\n * @internal\n */\nexport function isThenable<T>(value: T | Promise<T>): value is Promise<T> {\n\treturn value && typeof value === \"object\" && \"then\" in value && typeof value.then === \"function\";\n}\n","import {\n\ttype AsyncExpectationResult,\n\ttype MatcherState,\n\ttype SyncExpectationResult,\n} from \"@vitest/expect\";\nimport { isThenable } from \"./is-thenable\";\n\ntype SyncCallback<T, TArgs extends unknown[]> = (\n\tthis: MatcherState,\n\tactual: T,\n\t...args: TArgs\n) => SyncExpectationResult;\n\n/**\n * @internal\n */\nexport interface MaybeAsyncCallback<TActual, TArgs extends unknown[]> {\n\t(this: MatcherState, actual: TActual, ...args: TArgs): SyncExpectationResult;\n\t(this: MatcherState, actual: Promise<TActual>, ...args: TArgs): AsyncExpectationResult;\n}\n\n/**\n * Creates a wrapped function based on the passed function.\n *\n * The returned function takes either a `T` or `Promise<T>`. If `T` the result\n * will be synchronous or if `Promise<T>` the result will be asynchronous.\n *\n * In practice this means that if you pass a synchronous object into it you will\n * maintain synchronous code but if you pass an asynchronous object you must\n * await the result.\n *\n * @internal\n */\nexport function diverge<T, TArgs extends unknown[]>(\n\tfn: SyncCallback<T, TArgs>,\n): MaybeAsyncCallback<T, TArgs> {\n\tfunction diverged(this: MatcherState, actual: T, ...args: TArgs): SyncExpectationResult;\n\tfunction diverged(this: MatcherState, actual: Promise<T>, ...args: TArgs): AsyncExpectationResult;\n\tfunction diverged(\n\t\tthis: MatcherState,\n\t\tactual: T | Promise<T>,\n\t\t...args: TArgs\n\t): SyncExpectationResult | AsyncExpectationResult {\n\t\tif (isThenable(actual)) {\n\t\t\treturn actual.then((resolved) => fn.call(this, resolved, ...args));\n\t\t} else {\n\t\t\treturn fn.call(this, actual, ...args);\n\t\t}\n\t}\n\treturn diverged;\n}\n","import {\n\ttype MessagePort,\n\tMessageChannel,\n\tWorker,\n\treceiveMessageOnPort,\n} from \"node:worker_threads\";\nimport { legacyRequire } from \"../../resolve\";\nimport {\n\ttype AnyAsyncFn,\n\ttype AnyFn,\n\ttype MainToWorkerCommandMessage,\n\ttype MainToWorkerMessage,\n\ttype Syncify,\n\ttype WorkerToMainError,\n\ttype WorkerToMainMessage,\n} from \"./types\";\n\n/**\n * This is all based on the synckit library but without all the extra stuff such\n * as typescript, esbuld, pnp etc.\n */\n\nconst INT32_BYTES = 4;\nconst syncFnCache = new Map<string, AnyFn>();\nconst sharedBuffer = new SharedArrayBuffer(INT32_BYTES);\nconst sharedBufferView = new Int32Array(sharedBuffer, 0, 1);\n\nfunction isWorkerError<T>(value: WorkerToMainMessage<T>): value is WorkerToMainError {\n\treturn \"error\" in value;\n}\n\nfunction receiveMessageWithId<R>(port: MessagePort, expectedId: number): WorkerToMainMessage<R> {\n\t/* wait for the semaphore to be raised before receiving message */\n\tconst timeout = 30000;\n\tconst status = Atomics.wait(sharedBufferView, 0, 0, timeout);\n\tAtomics.store(sharedBufferView, 0, 0);\n\n\t/* handle timeout or unexpected errors */\n\tif (![\"ok\", \"not-equal\"].includes(status)) {\n\t\tconst abortMsg: MainToWorkerCommandMessage = {\n\t\t\tid: expectedId,\n\t\t\tcmd: \"abort\",\n\t\t};\n\t\tport.postMessage(abortMsg);\n\t\tthrow new Error(`Internal error: Atomics.wait() failed: ${status}`);\n\t}\n\n\t/* the worker process will post the message before raising the semaphore, we\n\t * should not reach this part of the code unless there is a message waiting to\n\t * be read */\n\tconst reply = receiveMessageOnPort(port) as { message: WorkerToMainMessage<R> };\n\tconst { id, ...message } = reply.message;\n\n\tif (id < expectedId) {\n\t\treturn receiveMessageWithId(port, expectedId);\n\t}\n\n\tif (expectedId !== id) {\n\t\tthrow new Error(`Internal error: Expected id ${String(expectedId)} but got id ${String(id)}`);\n\t}\n\n\treturn { id, ...message };\n}\n\nfunction startWorkerThread<R, T extends AnyAsyncFn<R>>(\n\tworkerPath: string,\n): (...args: Parameters<T>) => R {\n\tconst { port1: mainPort, port2: workerPort } = new MessageChannel();\n\tconst workerPathUrl = legacyRequire.resolve(workerPath);\n\tconst worker = new Worker(workerPathUrl, {\n\t\teval: false,\n\t\tworkerData: { sharedBuffer, workerPort },\n\t\ttransferList: [workerPort],\n\t});\n\n\tlet nextID = 0;\n\n\tconst syncFn = (...args: Parameters<T>): R => {\n\t\tconst id = nextID++;\n\t\tconst msg: MainToWorkerMessage<Parameters<T>> = { id, args };\n\n\t\tworker.postMessage(msg);\n\n\t\tconst reply = receiveMessageWithId<R>(mainPort, id);\n\n\t\tif (isWorkerError(reply)) {\n\t\t\tthrow new Error(reply.error);\n\t\t}\n\n\t\treturn reply.result;\n\t};\n\n\tworker.unref();\n\n\treturn syncFn;\n}\n\nexport function createSyncFn<T extends AnyAsyncFn<R>, R = unknown>(workerPath: string): Syncify<T> {\n\tconst cachedSyncFn = syncFnCache.get(workerPath);\n\tif (cachedSyncFn) {\n\t\treturn cachedSyncFn as Syncify<T>;\n\t}\n\n\tconst syncFn = startWorkerThread<R, T>(workerPath);\n\tsyncFnCache.set(workerPath, syncFn);\n\treturn syncFn as Syncify<T>;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from "../types/vitest-worker";
@@ -0,0 +1,62 @@
1
+ import { workerData, parentPort } from 'node:worker_threads';
2
+ import { F as FileSystemConfigLoader, H as HtmlValidate } from './core-nodejs.js';
3
+ import 'node:fs';
4
+ import './core.js';
5
+ import 'ajv';
6
+ import './elements.js';
7
+ import './meta-helper.js';
8
+ import './utils/natural-join.js';
9
+ import './utils/parse-image-candidate-string.js';
10
+ import '@sidvind/better-ajv-errors';
11
+ import 'kleur';
12
+ import '@html-validate/stylish';
13
+ import 'semver';
14
+ import 'node:path';
15
+ import 'node:fs/promises';
16
+ import 'node:url';
17
+ import 'node:module';
18
+
19
+ function runAsWorker(fn) {
20
+ if (!workerData) {
21
+ return;
22
+ }
23
+ const { workerPort, sharedBuffer } = workerData;
24
+ const sharedBufferView = new Int32Array(sharedBuffer, 0, 1);
25
+ parentPort.on("message", ({ id, args }) => {
26
+ async function inner() {
27
+ let isAborted = false;
28
+ const handleAbortMessage = (msg2) => {
29
+ if (msg2.id === id && msg2.cmd === "abort") {
30
+ isAborted = true;
31
+ }
32
+ };
33
+ workerPort.on("message", handleAbortMessage);
34
+ let msg;
35
+ try {
36
+ msg = { id, result: await fn(...args) };
37
+ } catch (error) {
38
+ msg = {
39
+ id,
40
+ error: error instanceof Error ? error.message : String(error)
41
+ };
42
+ }
43
+ workerPort.off("message", handleAbortMessage);
44
+ if (isAborted) {
45
+ return;
46
+ }
47
+ workerPort.postMessage(msg);
48
+ Atomics.add(sharedBufferView, 0, 1);
49
+ Atomics.notify(sharedBufferView, 0);
50
+ }
51
+ inner();
52
+ });
53
+ }
54
+ function validateString(markup, filename, config) {
55
+ const loader = new FileSystemConfigLoader({
56
+ extends: ["html-validate:recommended"]
57
+ });
58
+ const htmlvalidate = new HtmlValidate(loader);
59
+ return htmlvalidate.validateString(markup, filename, config);
60
+ }
61
+ runAsWorker(validateString);
62
+ //# sourceMappingURL=vitest-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-worker.js","sources":["../../src/vitest/worker/vitest-worker.ts"],"sourcesContent":["import { type MessagePort, parentPort, workerData } from \"node:worker_threads\";\nimport { type ConfigData } from \"../../config\";\nimport { FileSystemConfigLoader } from \"../../config/loaders/file-system\";\nimport { HtmlValidate } from \"../../htmlvalidate\";\nimport { type Report } from \"../../reporter\";\nimport {\n\ttype AnyAsyncFn,\n\ttype MainToWorkerCommandMessage,\n\ttype MainToWorkerMessage,\n\ttype WorkerToMainMessage,\n} from \"./types\";\n\ninterface WorkerData {\n\tsharedBuffer: SharedArrayBuffer;\n\tworkerPort: MessagePort;\n}\n\n/* eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- false positive, it is used in nested functions */\nfunction runAsWorker<R = unknown, T extends AnyAsyncFn<R> = AnyAsyncFn<R>>(fn: T): void {\n\tif (!workerData) {\n\t\treturn;\n\t}\n\n\tconst { workerPort, sharedBuffer } = workerData as WorkerData;\n\tconst sharedBufferView = new Int32Array(sharedBuffer, 0, 1);\n\n\t/* eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- better crash at runtime if not set */\n\tparentPort!.on(\"message\", ({ id, args }: MainToWorkerMessage<Parameters<T>>) => {\n\t\tasync function inner(): Promise<void> {\n\t\t\tlet isAborted = false;\n\t\t\tconst handleAbortMessage = (msg: MainToWorkerCommandMessage): void => {\n\t\t\t\tif (msg.id === id && msg.cmd === \"abort\") {\n\t\t\t\t\tisAborted = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\tworkerPort.on(\"message\", handleAbortMessage);\n\t\t\tlet msg: WorkerToMainMessage<R>;\n\t\t\ttry {\n\t\t\t\tmsg = { id, result: await fn(...args) };\n\t\t\t} catch (error: unknown) {\n\t\t\t\tmsg = {\n\t\t\t\t\tid,\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t};\n\t\t\t}\n\t\t\tworkerPort.off(\"message\", handleAbortMessage);\n\n\t\t\t/* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- it may have been set by `handleAbortMessage` */\n\t\t\tif (isAborted) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tworkerPort.postMessage(msg);\n\t\t\tAtomics.add(sharedBufferView, 0, 1);\n\t\t\tAtomics.notify(sharedBufferView, 0);\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/no-floating-promises -- should not happen\n\t\tinner();\n\t});\n}\n\nfunction validateString(markup: string, filename: string, config: ConfigData): Promise<Report> {\n\tconst loader = new FileSystemConfigLoader({\n\t\textends: [\"html-validate:recommended\"],\n\t});\n\tconst htmlvalidate = new HtmlValidate(loader);\n\treturn htmlvalidate.validateString(markup, filename, config);\n}\n\nexport type ValidateStringFn = typeof validateString;\n\nrunAsWorker(validateString);\n"],"names":["msg"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,SAAS,YAAkE,EAAA,EAAa;AACvF,EAAA,IAAI,CAAC,UAAA,EAAY;AAChB,IAAA;AAAA,EACD;AAEA,EAAA,MAAM,EAAE,UAAA,EAAY,YAAA,EAAa,GAAI,UAAA;AACrC,EAAA,MAAM,gBAAA,GAAmB,IAAI,UAAA,CAAW,YAAA,EAAc,GAAG,CAAC,CAAA;AAG1D,EAAA,UAAA,CAAY,GAAG,SAAA,EAAW,CAAC,EAAE,EAAA,EAAI,MAAK,KAA0C;AAC/E,IAAA,eAAe,KAAA,GAAuB;AACrC,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,MAAM,kBAAA,GAAqB,CAACA,IAAAA,KAA0C;AACrE,QAAA,IAAIA,IAAAA,CAAI,EAAA,KAAO,EAAA,IAAMA,IAAAA,CAAI,QAAQ,OAAA,EAAS;AACzC,UAAA,SAAA,GAAY,IAAA;AAAA,QACb;AAAA,MACD,CAAA;AACA,MAAA,UAAA,CAAW,EAAA,CAAG,WAAW,kBAAkB,CAAA;AAC3C,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI;AACH,QAAA,GAAA,GAAM,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAM,EAAA,CAAG,GAAG,IAAI,CAAA,EAAE;AAAA,MACvC,SAAS,KAAA,EAAgB;AACxB,QAAA,GAAA,GAAM;AAAA,UACL,EAAA;AAAA,UACA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC7D;AAAA,MACD;AACA,MAAA,UAAA,CAAW,GAAA,CAAI,WAAW,kBAAkB,CAAA;AAG5C,MAAA,IAAI,SAAA,EAAW;AACd,QAAA;AAAA,MACD;AACA,MAAA,UAAA,CAAW,YAAY,GAAG,CAAA;AAC1B,MAAA,OAAA,CAAQ,GAAA,CAAI,gBAAA,EAAkB,CAAA,EAAG,CAAC,CAAA;AAClC,MAAA,OAAA,CAAQ,MAAA,CAAO,kBAAkB,CAAC,CAAA;AAAA,IACnC;AAEA,IAAA,KAAA,EAAM;AAAA,EACP,CAAC,CAAA;AACF;AAEA,SAAS,cAAA,CAAe,MAAA,EAAgB,QAAA,EAAkB,MAAA,EAAqC;AAC9F,EAAA,MAAM,MAAA,GAAS,IAAI,sBAAA,CAAuB;AAAA,IACzC,OAAA,EAAS,CAAC,2BAA2B;AAAA,GACrC,CAAA;AACD,EAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,MAAM,CAAA;AAC5C,EAAA,OAAO,YAAA,CAAa,cAAA,CAAe,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAC5D;AAIA,WAAA,CAAY,cAAc,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { expect } from 'vitest';
2
- import { c as createMatcher, a as createMatcher$1, b as createMatcher$2, d as createMatcher$3, e as createMatcher$4 } from './matchers.js';
3
- import './matcher-utils.js';
2
+ import { c as createMatcher, a as createMatcher$1, b as createMatcher$2, d as createMatcher$3, e as createMatcher$4, f as createMatcher$5, g as createMatcher$6 } from './vitest-matchers.js';
3
+ import './vitest-utils.js';
4
4
  import './core.js';
5
5
  import 'ajv';
6
6
  import './elements.js';
@@ -20,10 +20,12 @@ import 'node:url';
20
20
  import 'node:module';
21
21
 
22
22
  expect.extend({
23
- toBeValid: createMatcher$4(),
24
- toBeInvalid: createMatcher$3(),
25
- toHTMLValidate: createMatcher$2(expect, void 0),
26
- toHaveError: createMatcher$1(expect, void 0),
27
- toHaveErrors: createMatcher(expect, void 0)
23
+ toBeValid: createMatcher$6(),
24
+ toBeInvalid: createMatcher$5(),
25
+ toHTMLValidate: createMatcher$4(expect),
26
+ toHaveError: createMatcher$3(expect),
27
+ toHaveErrors: createMatcher$2(expect),
28
+ toMatchCodeframe: createMatcher$1(),
29
+ toMatchInlineCodeframe: createMatcher()
28
30
  });
29
31
  //# sourceMappingURL=vitest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.js","sources":["../../src/vitest/vitest.ts"],"sourcesContent":["import \"./augmentation\";\n\nimport { expect } from \"vitest\";\nimport {\n\ttoBeInvalid,\n\ttoBeValid,\n\ttoHTMLValidate,\n\ttoHaveError,\n\ttoHaveErrors,\n} from \"../jest/matchers\";\n\nexpect.extend({\n\ttoBeValid: toBeValid(),\n\ttoBeInvalid: toBeInvalid(),\n\ttoHTMLValidate: toHTMLValidate(expect, undefined),\n\ttoHaveError: toHaveError(expect, undefined),\n\ttoHaveErrors: toHaveErrors(expect, undefined),\n});\n"],"names":["toBeValid","toBeInvalid","toHTMLValidate","toHaveError","toHaveErrors"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAWA,MAAA,CAAO,MAAA,CAAO;AAAA,EACb,WAAWA,eAAA,EAAU;AAAA,EACrB,aAAaC,eAAA,EAAY;AAAA,EACzB,cAAA,EAAgBC,eAAA,CAAe,MAAA,EAAQ,MAAS,CAAA;AAAA,EAChD,WAAA,EAAaC,eAAA,CAAY,MAAA,EAAQ,MAAS,CAAA;AAAA,EAC1C,YAAA,EAAcC,aAAA,CAAa,MAAA,EAAQ,MAAS;AAC7C,CAAC,CAAA"}
1
+ {"version":3,"file":"vitest.js","sources":["../../src/vitest/vitest.ts"],"sourcesContent":["import \"./augmentation\";\n\nimport { expect } from \"vitest\";\nimport {\n\ttoBeInvalid,\n\ttoBeValid,\n\ttoHTMLValidate,\n\ttoHaveError,\n\ttoHaveErrors,\n\ttoMatchCodeframe,\n\ttoMatchInlineCodeframe,\n} from \"./matchers\";\n\nexpect.extend({\n\ttoBeValid: toBeValid(),\n\ttoBeInvalid: toBeInvalid(),\n\ttoHTMLValidate: toHTMLValidate(expect),\n\ttoHaveError: toHaveError(expect),\n\ttoHaveErrors: toHaveErrors(expect),\n\ttoMatchCodeframe: toMatchCodeframe(),\n\ttoMatchInlineCodeframe: toMatchInlineCodeframe(),\n});\n"],"names":["toBeValid","toBeInvalid","toHTMLValidate","toHaveError","toHaveErrors","toMatchCodeframe","toMatchInlineCodeframe"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAaA,MAAA,CAAO,MAAA,CAAO;AAAA,EACb,WAAWA,eAAA,EAAU;AAAA,EACrB,aAAaC,eAAA,EAAY;AAAA,EACzB,cAAA,EAAgBC,gBAAe,MAAM,CAAA;AAAA,EACrC,WAAA,EAAaC,gBAAY,MAAM,CAAA;AAAA,EAC/B,YAAA,EAAcC,gBAAa,MAAM,CAAA;AAAA,EACjC,kBAAkBC,eAAA,EAAiB;AAAA,EACnC,wBAAwBC,aAAA;AACzB,CAAC,CAAA"}
@@ -1650,6 +1650,7 @@ export declare interface MetaElement extends Omit<MetaData, "deprecatedAttribute
1650
1650
  /** WAI-ARIA attributes */
1651
1651
  aria: NormalizedMetaAria;
1652
1652
  attributes: Record<string, MetaAttribute>;
1653
+ patternAttributes: NormalizedPatternAttribute[];
1653
1654
  textContent?: TextContent;
1654
1655
  }
1655
1656
 
@@ -1845,6 +1846,18 @@ export declare interface NormalizedMetaAria {
1845
1846
  naming(node: HtmlElementLike): "allowed" | "prohibited";
1846
1847
  }
1847
1848
 
1849
+ /**
1850
+ * A pattern attribute name with associated validation rules.
1851
+ *
1852
+ * @public
1853
+ */
1854
+ export declare interface NormalizedPatternAttribute extends MetaAttribute {
1855
+ /** Original glob pattern */
1856
+ pattern: string;
1857
+ /** Compiled regular expression */
1858
+ regexp: RegExp;
1859
+ }
1860
+
1848
1861
  /* Excluded from this release type: ParseBeginEvent */
1849
1862
 
1850
1863
  /* Excluded from this release type: ParseEndEvent */
@@ -1893,6 +1893,7 @@ export declare interface MetaElement extends Omit<MetaData, "deprecatedAttribute
1893
1893
  /** WAI-ARIA attributes */
1894
1894
  aria: NormalizedMetaAria;
1895
1895
  attributes: Record<string, MetaAttribute>;
1896
+ patternAttributes: NormalizedPatternAttribute[];
1896
1897
  textContent?: TextContent;
1897
1898
  }
1898
1899
 
@@ -2088,6 +2089,18 @@ export declare interface NormalizedMetaAria {
2088
2089
  naming(node: HtmlElementLike): "allowed" | "prohibited";
2089
2090
  }
2090
2091
 
2092
+ /**
2093
+ * A pattern attribute name with associated validation rules.
2094
+ *
2095
+ * @public
2096
+ */
2097
+ export declare interface NormalizedPatternAttribute extends MetaAttribute {
2098
+ /** Original glob pattern */
2099
+ pattern: string;
2100
+ /** Compiled regular expression */
2101
+ regexp: RegExp;
2102
+ }
2103
+
2091
2104
  /* Excluded from this release type: ParseBeginEvent */
2092
2105
 
2093
2106
  /* Excluded from this release type: ParseEndEvent */
@@ -42,5 +42,23 @@ declare module "vitest" {
42
42
  toHTMLValidate(config: ConfigData, filename?: string): T;
43
43
  toHTMLValidate(error: Partial<Message>, filename?: string): T;
44
44
  toHTMLValidate(error: Partial<Message>, config: ConfigData, filename?: string): T;
45
+ /**
46
+ * Writes out the given [[Report]] using codeframe formatter and compares
47
+ * with snapshot.
48
+ *
49
+ * * Requires Vitest v4.1.3 or later.
50
+ *
51
+ * @since 11.2.0
52
+ */
53
+ toMatchCodeframe(hint?: string): Promise<void>;
54
+ /**
55
+ * Writes out the given [[Report]] using codeframe formatter and compares
56
+ * with inline snapshot.
57
+ *
58
+ * Requires Vitest v4.1.3 or later.
59
+ *
60
+ * @since 11.2.0
61
+ */
62
+ toMatchInlineCodeframe(snapshot?: string): Promise<void>;
45
63
  }
46
64
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "html-validate",
3
- "version": "11.1.0",
3
+ "version": "11.3.0",
4
4
  "description": "Offline HTML5 validator and linter",
5
5
  "keywords": [
6
6
  "html",
@@ -90,7 +90,7 @@
90
90
  ],
91
91
  "dependencies": {
92
92
  "@html-validate/stylish": "^6.0.0",
93
- "@sidvind/better-ajv-errors": "6.0.0",
93
+ "@sidvind/better-ajv-errors": "7.0.0",
94
94
  "ajv": "^8.0.0",
95
95
  "kleur": "^4.1.0",
96
96
  "prompts": "^2.0.0",
@@ -98,8 +98,8 @@
98
98
  },
99
99
  "peerDependencies": {
100
100
  "@jest/globals": "^29.0.3 || ^30.0.0",
101
+ "@vitest/expect": "^3.0.0 || ^4.0.1",
101
102
  "jest": "^29.0.3 || ^30.0.0",
102
- "jest-diff": "^29.0.3 || ^30.0.0",
103
103
  "jest-snapshot": "^29.0.3 || ^30.0.0",
104
104
  "vitest": "^3.0.0 || ^4.0.1"
105
105
  },
@@ -107,10 +107,10 @@
107
107
  "@jest/globals": {
108
108
  "optional": true
109
109
  },
110
- "jest": {
110
+ "@vitest/expect": {
111
111
  "optional": true
112
112
  },
113
- "jest-diff": {
113
+ "jest": {
114
114
  "optional": true
115
115
  },
116
116
  "jest-snapshot": {