html-validate 11.0.0 → 11.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cli.js +8 -3
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/core.js +7 -4
- package/dist/cjs/core.js.map +1 -1
- package/dist/cjs/html-validate.js +35 -50
- package/dist/cjs/html-validate.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/{matchers.js → jest-matchers.js} +66 -38
- package/dist/cjs/jest-matchers.js.map +1 -0
- package/dist/cjs/{matcher-utils.js → jest-utils.js} +1 -8
- package/dist/cjs/jest-utils.js.map +1 -0
- package/dist/cjs/jest-worker.js.map +1 -1
- package/dist/cjs/jest.js +10 -13
- package/dist/cjs/jest.js.map +1 -1
- package/dist/cjs/vitest-matchers.js +281 -0
- package/dist/cjs/vitest-matchers.js.map +1 -0
- package/dist/cjs/vitest-utils.js +120 -0
- package/dist/cjs/vitest-utils.js.map +1 -0
- package/dist/cjs/vitest-worker.d.ts +1 -0
- package/dist/cjs/vitest-worker.js +63 -0
- package/dist/cjs/vitest-worker.js.map +1 -0
- package/dist/cjs/vitest.js +9 -7
- package/dist/cjs/vitest.js.map +1 -1
- package/dist/esm/browser.js +1 -1
- package/dist/esm/cli.js +10 -5
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/core-browser.js +1 -1
- package/dist/esm/core-nodejs.js +1 -1
- package/dist/esm/core.js +6 -4
- package/dist/esm/core.js.map +1 -1
- package/dist/esm/html-validate.js +37 -51
- package/dist/esm/html-validate.js.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/jest-matchers.js +263 -0
- package/dist/esm/jest-matchers.js.map +1 -0
- package/dist/esm/{matcher-utils.js → jest-utils.js} +3 -9
- package/dist/esm/jest-utils.js.map +1 -0
- package/dist/esm/jest-worker.js.map +1 -1
- package/dist/esm/jest.js +6 -9
- package/dist/esm/jest.js.map +1 -1
- package/dist/esm/{matchers.js → vitest-matchers.js} +62 -45
- package/dist/esm/vitest-matchers.js.map +1 -0
- package/dist/esm/vitest-utils.js +116 -0
- package/dist/esm/vitest-utils.js.map +1 -0
- package/dist/esm/vitest-worker.d.ts +1 -0
- package/dist/esm/vitest-worker.js +62 -0
- package/dist/esm/vitest-worker.js.map +1 -0
- package/dist/esm/vitest.js +9 -7
- package/dist/esm/vitest.js.map +1 -1
- package/dist/types/vitest.d.ts +18 -0
- package/package.json +7 -9
- package/dist/cjs/jest-diff.js +0 -41
- package/dist/cjs/jest-diff.js.map +0 -1
- package/dist/cjs/matcher-utils.js.map +0 -1
- package/dist/cjs/matchers-jestonly.js +0 -44
- package/dist/cjs/matchers-jestonly.js.map +0 -1
- package/dist/cjs/matchers.js.map +0 -1
- package/dist/esm/jest-diff.js +0 -20
- package/dist/esm/jest-diff.js.map +0 -1
- package/dist/esm/matcher-utils.js.map +0 -1
- package/dist/esm/matchers-jestonly.js +0 -41
- package/dist/esm/matchers-jestonly.js.map +0 -1
- package/dist/esm/matchers.js.map +0 -1
package/dist/esm/jest.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { expect } from '@jest/globals';
|
|
2
|
-
import { c as createMatcher, a as createMatcher$1 } from './matchers
|
|
3
|
-
import
|
|
4
|
-
import { d as diff } from './jest-diff.js';
|
|
5
|
-
import 'jest-snapshot';
|
|
6
|
-
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 './jest-matchers.js';
|
|
3
|
+
import './jest-utils.js';
|
|
7
4
|
import './core.js';
|
|
8
5
|
import 'ajv';
|
|
9
6
|
import './elements.js';
|
|
@@ -21,14 +18,14 @@ import 'node:path';
|
|
|
21
18
|
import 'node:fs/promises';
|
|
22
19
|
import 'node:url';
|
|
23
20
|
import 'node:module';
|
|
24
|
-
import 'jest-
|
|
21
|
+
import 'jest-snapshot';
|
|
25
22
|
|
|
26
23
|
expect.extend({
|
|
27
24
|
toBeValid: createMatcher$6(),
|
|
28
25
|
toBeInvalid: createMatcher$5(),
|
|
29
|
-
toHTMLValidate: createMatcher$4(expect
|
|
30
|
-
toHaveError: createMatcher$3(expect
|
|
31
|
-
toHaveErrors: createMatcher$2(expect
|
|
26
|
+
toHTMLValidate: createMatcher$4(expect),
|
|
27
|
+
toHaveError: createMatcher$3(expect),
|
|
28
|
+
toHaveErrors: createMatcher$2(expect),
|
|
32
29
|
toMatchCodeframe: createMatcher$1(),
|
|
33
30
|
toMatchInlineCodeframe: createMatcher()
|
|
34
31
|
});
|
package/dist/esm/jest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jest.js","sources":["../../src/jest/
|
|
1
|
+
{"version":3,"file":"jest.js","sources":["../../src/jest/index.ts"],"sourcesContent":["import { expect } from \"@jest/globals\";\nimport \"./augmentation\";\n\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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import { d as diverge,
|
|
2
|
-
import {
|
|
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$
|
|
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$
|
|
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$
|
|
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,
|
|
88
|
+
return toHTMLValidateImpl.call(this, expect, markup, message, config, filename);
|
|
87
89
|
}
|
|
88
90
|
return diverge(toHTMLValidate);
|
|
89
91
|
}
|
|
90
|
-
function toHTMLValidateImpl(expect,
|
|
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(
|
|
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
|
|
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,
|
|
142
|
-
const flattened =
|
|
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
|
|
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$
|
|
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,
|
|
174
|
+
return toHaveErrorImpl(this, expect, actual, expected);
|
|
180
175
|
} else {
|
|
181
|
-
return toHaveErrorImpl(this, expect,
|
|
176
|
+
return toHaveErrorImpl(this, expect, actual, arg1);
|
|
182
177
|
}
|
|
183
178
|
}
|
|
184
179
|
return diverge(toHaveError);
|
|
185
180
|
}
|
|
186
181
|
|
|
187
|
-
function createMatcher(expect
|
|
182
|
+
function createMatcher$2(expect) {
|
|
188
183
|
function toHaveErrors(report, errors) {
|
|
189
|
-
const flattened =
|
|
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
|
|
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
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
|
|
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,
|
|
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"}
|
package/dist/esm/vitest.js
CHANGED
|
@@ -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 './
|
|
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$
|
|
24
|
-
toBeInvalid: createMatcher$
|
|
25
|
-
toHTMLValidate: createMatcher$
|
|
26
|
-
toHaveError: createMatcher$
|
|
27
|
-
toHaveErrors: createMatcher(expect,
|
|
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
|
package/dist/esm/vitest.js.map
CHANGED
|
@@ -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 \"
|
|
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"}
|
package/dist/types/vitest.d.ts
CHANGED
|
@@ -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.
|
|
3
|
+
"version": "11.2.0",
|
|
4
4
|
"description": "Offline HTML5 validator and linter",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"html",
|
|
@@ -89,19 +89,17 @@
|
|
|
89
89
|
"dist"
|
|
90
90
|
],
|
|
91
91
|
"dependencies": {
|
|
92
|
-
"@html-validate/stylish": "^
|
|
93
|
-
"@sidvind/better-ajv-errors": "
|
|
92
|
+
"@html-validate/stylish": "^6.0.0",
|
|
93
|
+
"@sidvind/better-ajv-errors": "7.0.0",
|
|
94
94
|
"ajv": "^8.0.0",
|
|
95
|
-
"glob": "^13.0.0",
|
|
96
95
|
"kleur": "^4.1.0",
|
|
97
|
-
"minimist": "^1.2.0",
|
|
98
96
|
"prompts": "^2.0.0",
|
|
99
97
|
"semver": "^7.0.0"
|
|
100
98
|
},
|
|
101
99
|
"peerDependencies": {
|
|
102
100
|
"@jest/globals": "^29.0.3 || ^30.0.0",
|
|
101
|
+
"@vitest/expect": "^3.0.0 || ^4.0.1",
|
|
103
102
|
"jest": "^29.0.3 || ^30.0.0",
|
|
104
|
-
"jest-diff": "^29.0.3 || ^30.0.0",
|
|
105
103
|
"jest-snapshot": "^29.0.3 || ^30.0.0",
|
|
106
104
|
"vitest": "^3.0.0 || ^4.0.1"
|
|
107
105
|
},
|
|
@@ -109,10 +107,10 @@
|
|
|
109
107
|
"@jest/globals": {
|
|
110
108
|
"optional": true
|
|
111
109
|
},
|
|
112
|
-
"
|
|
110
|
+
"@vitest/expect": {
|
|
113
111
|
"optional": true
|
|
114
112
|
},
|
|
115
|
-
"jest
|
|
113
|
+
"jest": {
|
|
116
114
|
"optional": true
|
|
117
115
|
},
|
|
118
116
|
"jest-snapshot": {
|
|
@@ -123,6 +121,6 @@
|
|
|
123
121
|
}
|
|
124
122
|
},
|
|
125
123
|
"engines": {
|
|
126
|
-
"node": "^22.
|
|
124
|
+
"node": "^22.17.0 || >= 24.0.0"
|
|
127
125
|
}
|
|
128
126
|
}
|