@vitest/browser 5.0.0-beta.6 → 5.0.0-beta.7
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/client/.vite/manifest.json +2 -2
- package/dist/client/__vitest_browser__/{orchestrator-pKob2Z-i.js → orchestrator-Bdv4lWwV.js} +9 -2
- package/dist/client/__vitest_browser__/{tester-DdZeFrjo.js → tester-CREI5Ivt.js} +20 -9
- package/dist/client/orchestrator.html +1 -1
- package/dist/client/tester/tester.html +1 -1
- package/dist/context.js +4 -2
- package/dist/expect-element.js +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +507 -532
- package/dist/{locators-CVQtUwrj.js → locators-Cxk-0tRh.js} +1 -1
- package/dist/locators.js +1 -1
- package/dist/state.js +1 -0
- package/package.json +7 -7
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"name": "defineProperty"
|
|
11
11
|
},
|
|
12
12
|
"orchestrator.html": {
|
|
13
|
-
"file": "__vitest_browser__/orchestrator-
|
|
13
|
+
"file": "__vitest_browser__/orchestrator-Bdv4lWwV.js",
|
|
14
14
|
"name": "orchestrator",
|
|
15
15
|
"src": "orchestrator.html",
|
|
16
16
|
"isEntry": true,
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
]
|
|
20
20
|
},
|
|
21
21
|
"tester/tester.html": {
|
|
22
|
-
"file": "__vitest_browser__/tester-
|
|
22
|
+
"file": "__vitest_browser__/tester-CREI5Ivt.js",
|
|
23
23
|
"name": "tester",
|
|
24
24
|
"src": "tester/tester.html",
|
|
25
25
|
"isEntry": true,
|
package/dist/client/__vitest_browser__/{orchestrator-pKob2Z-i.js → orchestrator-Bdv4lWwV.js}
RENAMED
|
@@ -53,7 +53,7 @@ var IframeOrchestrator = class {
|
|
|
53
53
|
container.setAttribute("data-ready", "true");
|
|
54
54
|
if (container.textContent) container.textContent = "";
|
|
55
55
|
}
|
|
56
|
-
if (config.
|
|
56
|
+
if (config.isolate === false) {
|
|
57
57
|
await this.runNonIsolatedTests(container, options, startTime, orchestratorSpan.context);
|
|
58
58
|
await endSpan();
|
|
59
59
|
return;
|
|
@@ -74,7 +74,7 @@ var IframeOrchestrator = class {
|
|
|
74
74
|
await endSpan();
|
|
75
75
|
}
|
|
76
76
|
async cleanupTesters() {
|
|
77
|
-
if (getConfig().
|
|
77
|
+
if (getConfig().isolate) {
|
|
78
78
|
const files = Array.from(this.iframes.keys());
|
|
79
79
|
const ui = /* @__PURE__ */ getUiAPI();
|
|
80
80
|
if (ui && files[0]) {
|
|
@@ -372,16 +372,23 @@ function generateFileId(file) {
|
|
|
372
372
|
__vitest_label__: config.mergeReportsLabel
|
|
373
373
|
});
|
|
374
374
|
}
|
|
375
|
+
var currentViewport;
|
|
375
376
|
async function setIframeViewport(width, height) {
|
|
376
377
|
const ui = /* @__PURE__ */ getUiAPI();
|
|
377
378
|
if (ui) await ui.setIframeViewport(width, height);
|
|
378
379
|
else {
|
|
379
380
|
document.body.style.setProperty("--viewport-width", `${width}px`);
|
|
380
381
|
document.body.style.setProperty("--viewport-height", `${height}px`);
|
|
382
|
+
const cacheable = (/* @__PURE__ */ getBrowserState()).provider === "playwright";
|
|
383
|
+
if (cacheable && (currentViewport === null || currentViewport === void 0 ? void 0 : currentViewport.width) === width && (currentViewport === null || currentViewport === void 0 ? void 0 : currentViewport.height) === height) return;
|
|
381
384
|
await client.rpc.triggerCommand((/* @__PURE__ */ getBrowserState()).sessionId, "__vitest_viewport", void 0, [{
|
|
382
385
|
width,
|
|
383
386
|
height
|
|
384
387
|
}]);
|
|
388
|
+
currentViewport = cacheable ? {
|
|
389
|
+
width,
|
|
390
|
+
height
|
|
391
|
+
} : void 0;
|
|
385
392
|
}
|
|
386
393
|
}
|
|
387
394
|
function debug(...args) {
|
|
@@ -2,7 +2,7 @@ import { a as moduleRunner, d as resolve, i as getWorkerState, l as getTestName,
|
|
|
2
2
|
import { channel, client, globalChannel, onCancel, registerPageMarkHandler } from "@vitest/browser/client";
|
|
3
3
|
import { Traces } from "vitest/internal/traces";
|
|
4
4
|
import { page, server, userEvent } from "vitest/browser";
|
|
5
|
-
import { DecodedMap, SpyModule, collectTests, format, getOriginalPosition, getSafeTimers, loadDiffConfig, loadSnapshotSerializers, setupCommonEnv, startCoverageInsideWorker, startTests, stopCoverageInsideWorker, takeCoverageInsideWorker } from "vitest/internal/browser";
|
|
5
|
+
import { DecodedMap, SpyModule, collectTests, format, getOriginalPosition, getSafeTimers, loadDiffConfig, loadSnapshotSerializers, setupCommonEnv, setupEnv, startCoverageInsideWorker, startTests, stopCoverageInsideWorker, takeCoverageInsideWorker } from "vitest/internal/browser";
|
|
6
6
|
import { TestRunner, recordArtifact } from "vitest";
|
|
7
7
|
|
|
8
8
|
//#region \0rolldown/runtime.js
|
|
@@ -106,6 +106,7 @@ expect(${name}).toHaveBeenCalledWith(${formattedParams})
|
|
|
106
106
|
function setupDialogsSpy() {
|
|
107
107
|
globalThis.alert = showPopupWarning("alert", void 0);
|
|
108
108
|
globalThis.confirm = showPopupWarning("confirm", false, true);
|
|
109
|
+
globalThis.print = showPopupWarning("print", void 0);
|
|
109
110
|
globalThis.prompt = showPopupWarning("prompt", null, "your value");
|
|
110
111
|
}
|
|
111
112
|
|
|
@@ -545,7 +546,8 @@ var stackIgnorePatterns = [
|
|
|
545
546
|
/__vitest_test__/,
|
|
546
547
|
/__vitest_browser__/,
|
|
547
548
|
"/@id/__x00__vitest/browser",
|
|
548
|
-
/\/deps\/vitest_
|
|
549
|
+
/\/deps\/vitest_/,
|
|
550
|
+
"/deps/vitest.js"
|
|
549
551
|
];
|
|
550
552
|
var NOW_LENGTH$1 = Date.now().toString().length;
|
|
551
553
|
var REGEXP_VITEST$1 = new RegExp(`vitest=\\d{${NOW_LENGTH$1}}`);
|
|
@@ -638,7 +640,12 @@ function parseStacktrace(stack, options = {}) {
|
|
|
638
640
|
if (options.getUrlId) stack.file = options.getUrlId(stack.file);
|
|
639
641
|
const map = (_options$getSourceMap = options.getSourceMap) === null || _options$getSourceMap === void 0 ? void 0 : _options$getSourceMap.call(options, stack.file);
|
|
640
642
|
if (!map || typeof map !== "object" || !map.version) return shouldFilter(ignoreStackEntries, stack.file) ? null : stack;
|
|
641
|
-
const
|
|
643
|
+
const traceMap = new DecodedMap$1(map, stack.file);
|
|
644
|
+
if (stack.line <= 0 || stack.column <= 0) return stack;
|
|
645
|
+
const position = getOriginalPosition$1(traceMap, {
|
|
646
|
+
line: stack.line,
|
|
647
|
+
column: stack.column - 1
|
|
648
|
+
});
|
|
642
649
|
if (!position) return stack;
|
|
643
650
|
const { line, column, source, name } = position;
|
|
644
651
|
let file = source || stack.file;
|
|
@@ -646,7 +653,7 @@ function parseStacktrace(stack, options = {}) {
|
|
|
646
653
|
if (shouldFilter(ignoreStackEntries, file)) return null;
|
|
647
654
|
if (line != null && column != null) return {
|
|
648
655
|
line,
|
|
649
|
-
column,
|
|
656
|
+
column: column + 1,
|
|
650
657
|
file,
|
|
651
658
|
method: name || stack.method
|
|
652
659
|
};
|
|
@@ -833,6 +840,7 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
833
840
|
_defineProperty(this, "config", void 0);
|
|
834
841
|
_defineProperty(this, "hashMap", browserHashMap);
|
|
835
842
|
_defineProperty(this, "sourceMapCache", /* @__PURE__ */ new Map());
|
|
843
|
+
_defineProperty(this, "sourceMapPrefetches", /* @__PURE__ */ new Map());
|
|
836
844
|
_defineProperty(this, "method", "run");
|
|
837
845
|
_defineProperty(this, "commands", void 0);
|
|
838
846
|
_defineProperty(this, "traces", /* @__PURE__ */ new Map());
|
|
@@ -918,7 +926,8 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
918
926
|
var _super$onBeforeRunSui;
|
|
919
927
|
await Promise.all([(_super$onBeforeRunSui = super.onBeforeRunSuite) === null || _super$onBeforeRunSui === void 0 ? void 0 : _super$onBeforeRunSui.call(this, suite), (async () => {
|
|
920
928
|
if (!("filepath" in suite)) return;
|
|
921
|
-
const map = await rpc$2().getBrowserFileSourceMap(suite.filepath);
|
|
929
|
+
const map = await (this.sourceMapPrefetches.get(suite.filepath) ?? rpc$2().getBrowserFileSourceMap(suite.filepath));
|
|
930
|
+
this.sourceMapPrefetches.delete(suite.filepath);
|
|
922
931
|
this.sourceMapCache.set(suite.filepath, map);
|
|
923
932
|
const snapshotEnvironment = this.config.snapshotOptions.snapshotEnvironment;
|
|
924
933
|
if (snapshotEnvironment instanceof VitestBrowserSnapshotEnvironment) snapshotEnvironment.addSourceMap(suite.filepath, map);
|
|
@@ -930,7 +939,7 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
930
939
|
if (coverage) await rpc$2().onAfterSuiteRun({
|
|
931
940
|
coverage,
|
|
932
941
|
testFiles: files.map((file) => file.name),
|
|
933
|
-
environment: "
|
|
942
|
+
environment: "client",
|
|
934
943
|
projectName: this.config.name
|
|
935
944
|
});
|
|
936
945
|
});
|
|
@@ -995,6 +1004,7 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
995
1004
|
} catch (err) {
|
|
996
1005
|
throw new Error(`Failed to import test file ${filepath}`, { cause: err });
|
|
997
1006
|
}
|
|
1007
|
+
if (mode === "collect" && !this.sourceMapPrefetches.has(filepath)) this.sourceMapPrefetches.set(filepath, rpc$2().getBrowserFileSourceMap(filepath).catch(() => void 0));
|
|
998
1008
|
});
|
|
999
1009
|
_defineProperty(this, "trace", (name, attributes, cb) => {
|
|
1000
1010
|
const options = typeof attributes === "object" ? { attributes } : {};
|
|
@@ -1002,7 +1012,7 @@ function createBrowserRunner(mocker, state, coverageModule) {
|
|
|
1002
1012
|
});
|
|
1003
1013
|
this.config = options.config;
|
|
1004
1014
|
this.commands = (/* @__PURE__ */ getBrowserState()).commands;
|
|
1005
|
-
this.viteEnvironment = "
|
|
1015
|
+
this.viteEnvironment = "client";
|
|
1006
1016
|
this._otel = (/* @__PURE__ */ getBrowserState()).traces;
|
|
1007
1017
|
}
|
|
1008
1018
|
setMethod(method) {
|
|
@@ -2067,9 +2077,10 @@ async function prepare(options) {
|
|
|
2067
2077
|
const { config, state } = preparedData;
|
|
2068
2078
|
state.durations.prepare = performance.now() - state.durations.prepare;
|
|
2069
2079
|
debug === null || debug === void 0 || debug("prepare time", state.durations.prepare, "ms");
|
|
2080
|
+
setupEnv(config.env, state.metaEnv);
|
|
2070
2081
|
await Promise.all([
|
|
2071
2082
|
setupCommonEnv(config),
|
|
2072
|
-
startCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.
|
|
2083
|
+
startCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.isolate }),
|
|
2073
2084
|
(async () => {
|
|
2074
2085
|
const VitestIndex = await __vitePreload(() => import("vitest"), []);
|
|
2075
2086
|
Object.defineProperty(window, "__vitest_index__", {
|
|
@@ -2093,7 +2104,7 @@ async function cleanup() {
|
|
|
2093
2104
|
await userEvent.cleanup().catch((error) => unhandledError(error, "Cleanup Error"));
|
|
2094
2105
|
await Promise.all((/* @__PURE__ */ getBrowserState()).cleanups.map((fn) => fn())).catch((error) => unhandledError(error, "Cleanup Error"));
|
|
2095
2106
|
if (contextSwitched) await rpc.wdioSwitchContext("parent").catch((error) => unhandledError(error, "Cleanup Error"));
|
|
2096
|
-
await stopCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.
|
|
2107
|
+
await stopCoverageInsideWorker(config.coverage, moduleRunner, { isolate: config.isolate }).catch((error) => {
|
|
2097
2108
|
return unhandledError(error, "Coverage Error");
|
|
2098
2109
|
});
|
|
2099
2110
|
}
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
{__VITEST_INJECTOR__}
|
|
27
27
|
{__VITEST_ERROR_CATCHER__}
|
|
28
28
|
{__VITEST_SCRIPTS__}
|
|
29
|
-
<script type="module" crossorigin src="/__vitest_browser__/orchestrator-
|
|
29
|
+
<script type="module" crossorigin src="/__vitest_browser__/orchestrator-Bdv4lWwV.js"></script>
|
|
30
30
|
<link rel="modulepreload" crossorigin href="/__vitest_browser__/defineProperty-WHpdAQXR.js">
|
|
31
31
|
</head>
|
|
32
32
|
<body>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<link rel="icon" href="{__VITEST_FAVICON__}" type="image/svg+xml">
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<title>Vitest Browser Tester</title>
|
|
8
|
-
<script type="module" crossorigin src="/__vitest_browser__/tester-
|
|
8
|
+
<script type="module" crossorigin src="/__vitest_browser__/tester-CREI5Ivt.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/__vitest_browser__/defineProperty-WHpdAQXR.js">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
package/dist/context.js
CHANGED
|
@@ -247,8 +247,10 @@ function processTimeoutOptions(options_) {
|
|
|
247
247
|
const remainingTime = Math.floor(endTime - currentTime);
|
|
248
248
|
// keep some buffer to process the timeout, but always hand the provider a
|
|
249
249
|
// positive value so it surfaces a descriptive, source-mapped locator error
|
|
250
|
-
// instead of letting the task timer win the race with a generic timeout
|
|
251
|
-
|
|
250
|
+
// instead of letting the task timer win the race with a generic timeout;
|
|
251
|
+
// the buffer covers the provider->server->client round-trip of the rejection,
|
|
252
|
+
// which can exceed 100ms on loaded CI machines running several browsers
|
|
253
|
+
options_.timeout = Math.max(remainingTime - 250, 1);
|
|
252
254
|
return options_;
|
|
253
255
|
}
|
|
254
256
|
const provider$1 = getBrowserState().provider;
|
package/dist/expect-element.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Snapshots as e,recordArtifact as t,expect as n,chai as r}from"vitest";import{getType as i}from"vitest/internal/browser";import{b as a,e as o,i as s,g as c,n as l,a as u,k as d,c as f,d as ee,f as te,h as ne,j as re,l as ie,m as ae,o as oe,p as se,q as ce,r as le,s as ue,t as p,_ as m,u as h,L as g,v as de,w as fe,x as pe,y as me,z as he,A as ge,B as _e,C as ve,D as ye,E as be}from"./locators-
|
|
1
|
+
import{Snapshots as e,recordArtifact as t,expect as n,chai as r}from"vitest";import{getType as i}from"vitest/internal/browser";import{b as a,e as o,i as s,g as c,n as l,a as u,k as d,c as f,d as ee,f as te,h as ne,j as re,l as ie,m as ae,o as oe,p as se,q as ce,r as le,s as ue,t as p,_ as m,u as h,L as g,v as de,w as fe,x as pe,y as me,z as he,A as ge,B as _e,C as ve,D as ye,E as be}from"./locators-Cxk-0tRh.js";import{server as xe}from"vitest/browser";var Se=Object.defineProperty,Ce=(e,t)=>{let n={};for(var r in e)Se(n,r,{get:e[r],enumerable:!0});return Se(n,Symbol.toStringTag,{value:`Module`}),n};function we(e,t,n={}){let r=Te(e,t,n);if(r.errors.length)throw Error(r.errors[0].message);return r.fragment}function Te(e,t,n={}){let r=new e.LineCounter,i={keepSourceTokens:!0,lineCounter:r,...n},a=e.parseDocument(t,i),o=[],s=e=>[r.linePos(e[0]),r.linePos(e[1])],c=e=>{o.push({message:e.message,range:[r.linePos(e.pos[0]),r.linePos(e.pos[1])]})},l=(t,n)=>{for(let r of n.items){if(r instanceof e.Scalar&&typeof r.value==`string`){let e=v.parse(r,i,o);e&&(t.children=t.children||[],t.children.push(e));continue}if(r instanceof e.YAMLMap){u(t,r);continue}o.push({message:`Sequence items should be strings or maps`,range:s(r.range||n.range)})}},u=(t,n)=>{for(let r of n.items){if(t.children=t.children||[],!(r.key instanceof e.Scalar&&typeof r.key.value==`string`)){o.push({message:`Only string keys are supported`,range:s(r.key.range||n.range)});continue}let a=r.key,c=r.value;if(a.value===`text`){if(!(c instanceof e.Scalar&&typeof c.value==`string`)){o.push({message:`Text value should be a string`,range:s(r.value.range||n.range)});continue}t.children.push({kind:`text`,text:_(c.value)});continue}if(a.value===`/children`){if(!(c instanceof e.Scalar&&typeof c.value==`string`)||c.value!==`contain`&&c.value!==`equal`&&c.value!==`deep-equal`){o.push({message:`Strict value should be "contain", "equal" or "deep-equal"`,range:s(r.value.range||n.range)});continue}t.containerMode=c.value;continue}if(a.value.startsWith(`/`)){if(!(c instanceof e.Scalar&&typeof c.value==`string`)){o.push({message:`Property value should be a string`,range:s(r.value.range||n.range)});continue}t.props=t.props??{},t.props[a.value.slice(1)]=_(c.value);continue}let u=v.parse(a,i,o);if(u){if(c instanceof e.Scalar){let e=typeof c.value;if(e!==`string`&&e!==`number`&&e!==`boolean`){o.push({message:`Node value should be a string or a sequence`,range:s(r.value.range||n.range)});continue}t.children.push({...u,children:[{kind:`text`,text:_(String(c.value))}]});continue}if(c instanceof e.YAMLSeq){t.children.push(u),l(u,c);continue}o.push({message:`Map values should be strings or sequences`,range:s(r.value.range||n.range)})}}},d={kind:`role`,role:`fragment`};return a.errors.forEach(c),o.length?{errors:o,fragment:d}:a.contents?(a.contents instanceof e.YAMLSeq||o.push({message:`Aria snapshot must be a YAML sequence, elements starting with " -"`,range:s(a.contents.range)}),o.length?{errors:o,fragment:d}:(l(d,a.contents),o.length?{errors:o,fragment:Ee}:d.children?.length===1&&(!d.containerMode||d.containerMode===`contain`)?{fragment:d.children[0],errors:[]}:{fragment:d,errors:[]})):{fragment:d,errors:[]}}const Ee={kind:`role`,role:`fragment`};function De(e){return e.replace(/[\u200b\u00ad]/g,``).replace(/[\r\n\s\t]+/g,` `).trim()}function _(e){return{raw:e,normalized:De(e)}}var v=class e{static parse(t,n,r){try{return new e(t.value)._parse()}catch(e){if(e instanceof y){let i=n.prettyErrors===!1?e.message:`${e.message}:\n\n${t.value}\n${` `.repeat(e.pos)}^\n`;return r.push({message:i,range:[n.lineCounter.linePos(t.range[0]),n.lineCounter.linePos(t.range[0]+e.pos)]}),null}throw e}}constructor(e){m(this,`_input`,void 0),m(this,`_pos`,void 0),m(this,`_length`,void 0),this._input=e,this._pos=0,this._length=e.length}_peek(){return this._input[this._pos]||``}_next(){return this._pos<this._length?this._input[this._pos++]:null}_eof(){return this._pos>=this._length}_isWhitespace(){return!this._eof()&&/\s/.test(this._peek())}_skipWhitespace(){for(;this._isWhitespace();)this._pos++}_readIdentifier(e){this._eof()&&this._throwError(`Unexpected end of input when expecting ${e}`);let t=this._pos;for(;!this._eof()&&/[a-zA-Z]/.test(this._peek());)this._pos++;return this._input.slice(t,this._pos)}_readString(){let e=``,t=!1;for(;!this._eof();){let n=this._next();if(t)e+=n,t=!1;else if(n===`\\`)t=!0;else if(n===`"`)return e;else e+=n}this._throwError(`Unterminated string`)}_throwError(e,t=0){throw new y(e,t||this._pos)}_readRegex(){let e=``,t=!1,n=!1;for(;!this._eof();){let r=this._next();if(t)e+=r,t=!1;else if(r===`\\`)t=!0,e+=r;else if(r===`/`&&!n)return{pattern:e};else r===`[`?(n=!0,e+=r):r===`]`&&n?(e+=r,n=!1):e+=r}this._throwError(`Unterminated regex`)}_readStringOrRegex(){let e=this._peek();return e===`"`?(this._next(),De(this._readString())):e===`/`?(this._next(),this._readRegex()):null}_readAttributes(e){let t=this._pos;for(;this._skipWhitespace(),this._peek()===`[`;){this._next(),this._skipWhitespace(),t=this._pos;let n=this._readIdentifier(`attribute`);this._skipWhitespace();let r=``;if(this._peek()===`=`)for(this._next(),this._skipWhitespace(),t=this._pos;this._peek()!==`]`&&!this._isWhitespace()&&!this._eof();)r+=this._next();this._skipWhitespace(),this._peek()!==`]`&&this._throwError(`Expected ]`),this._next(),this._applyAttribute(e,n,r||`true`,t)}}_parse(){this._skipWhitespace();let e=this._readIdentifier(`role`);e===`fragment`&&this._throwError(`Invalid role "fragment"`),this._skipWhitespace();let t={kind:`role`,role:e,name:this._readStringOrRegex()||void 0};return this._readAttributes(t),this._skipWhitespace(),this._eof()||this._throwError(`Unexpected input`),t}_applyAttribute(e,t,n,r){if(t===`checked`){this._assert(n===`true`||n===`false`||n===`mixed`,`Value of "checked" attribute must be a boolean or "mixed"`,r),e.checked=n===`true`?!0:n===`false`?!1:`mixed`;return}if(t===`disabled`){this._assert(n===`true`||n===`false`,`Value of "disabled" attribute must be a boolean`,r),e.disabled=n===`true`;return}if(t===`expanded`){this._assert(n===`true`||n===`false`,`Value of "expanded" attribute must be a boolean`,r),e.expanded=n===`true`;return}if(t===`active`){this._assert(n===`true`||n===`false`,`Value of "active" attribute must be a boolean`,r),e.active=n===`true`;return}if(t===`level`){this._assert(!Number.isNaN(Number(n)),`Value of "level" attribute must be a number`,r),e.level=Number(n);return}if(t===`pressed`){this._assert(n===`true`||n===`false`||n===`mixed`,`Value of "pressed" attribute must be a boolean or "mixed"`,r),e.pressed=n===`true`?!0:n===`false`?!1:`mixed`;return}if(t===`selected`){this._assert(n===`true`||n===`false`,`Value of "selected" attribute must be a boolean`,r),e.selected=n===`true`;return}this._assert(!1,`Unsupported attribute [${t}]`,r)}_assert(e,t,n){e||this._throwError(t||`Assertion error`,n)}},y=class extends Error{constructor(e,t){super(e),m(this,`pos`,void 0),this.pos=t}};function b(e,t){return t?e?typeof t==`string`?e===t:!!e.match(new RegExp(t.pattern)):!1:!0}function x(e,t){if(!t?.normalized)return!0;if(!e)return!1;if(e===t.normalized||e===t.raw)return!0;let n=C(t);return n?!!e.match(n):!1}const S=Symbol(`cachedRegex`);function C(e){if(e[S]!==void 0)return e[S];let{raw:t}=e,n=t.startsWith(`/`)&&t.endsWith(`/`)&&t.length>1,r;try{r=n?new RegExp(t.slice(1,-1)):null}catch{r=null}return e[S]=r,r}function w(e,t,n){if(typeof e==`string`&&t.kind===`text`)return x(e,t.text);if(typeof e!=`object`||!e||t.kind!==`role`||t.role!==`fragment`&&t.role!==e.role||t.checked!==void 0&&t.checked!==e.checked||t.disabled!==void 0&&t.disabled!==e.disabled||t.expanded!==void 0&&t.expanded!==e.expanded||t.level!==void 0&&t.level!==e.level||t.pressed!==void 0&&t.pressed!==e.pressed||t.selected!==void 0&&t.selected!==e.selected||!b(e.name,t.name))return!1;if(t.props){for(let[n,r]of Object.entries(t.props))if(!x(e.props[n]||``,r))return!1}return t.containerMode===`contain`?E(e.children||[],t.children||[]):t.containerMode===`equal`?T(e.children||[],t.children||[],!1):t.containerMode===`deep-equal`||n?T(e.children||[],t.children||[],!0):E(e.children||[],t.children||[])}function T(e,t,n){if(t.length!==e.length)return!1;for(let r=0;r<t.length;++r)if(!w(e[r],t[r],n))return!1;return!0}function E(e,t){if(t.length>e.length)return!1;let n=e.slice(),r=t.slice();for(let e of r){let t=n.shift();for(;t&&!w(t,e,!1);)t=n.shift();if(!t)return!1}return!0}var Oe=Ce({LineCounter:()=>ke,Scalar:()=>D,YAMLError:()=>A,YAMLMap:()=>O,YAMLSeq:()=>k,parseDocument:()=>Ae}),D=class{constructor(e,t=[0,0,0]){m(this,`value`,void 0),m(this,`range`,void 0),this.value=e,this.range=t}},O=class{constructor(e=[0,0,0]){m(this,`items`,void 0),m(this,`range`,void 0),this.items=[],this.range=e}},k=class{constructor(e=[0,0,0]){m(this,`items`,void 0),m(this,`range`,void 0),this.items=[],this.range=e}},ke=class{constructor(){m(this,`lineStarts`,[0])}addNewLine(e){e>this.lineStarts[this.lineStarts.length-1]&&this.lineStarts.push(e)}linePos(e){let t=0,n=this.lineStarts.length-1;for(;t<n;){let r=t+n+1>>1;this.lineStarts[r]<=e?t=r:n=r-1}return{line:t+1,col:e-this.lineStarts[t]+1}}},A=class extends Error{constructor(e,t){super(e),m(this,`pos`,void 0),this.pos=t}};function Ae(e,t={}){let n=t.lineCounter,r=[];if(n)for(let t=0;t<e.length;t++)e[t]===`
|
|
2
2
|
`&&n.addNewLine(t+1);try{return{contents:new je(e,r).parseRoot(),errors:r}}catch(e){if(e instanceof A)return r.push(e),{contents:null,errors:r};throw e}}var je=class{constructor(e,t){m(this,`lines`,void 0),m(this,`pos`,void 0),m(this,`text`,void 0),m(this,`errors`,void 0),this.text=e,this.errors=t,this.lines=[],this.pos=0;let n=0,r=e.split(`
|
|
3
3
|
`);for(let e of r){let t=e.replace(/\r$/,``),r=t.replace(/^\s+/,``),i=t.length-r.length;this.lines.push({indent:i,content:r,offset:n+i,lineOffset:n,raw:t}),n+=e.length+1}for(;this.lines.length>0&&this.lines[this.lines.length-1].content===``;)this.lines.pop()}parseRoot(){if(this.lines.length===0)return null;let e=this.parseNode(0);if(this.skipEmpty(),this.pos<this.lines.length){let e=this.currentLine();this.addError(`Unexpected scalar at node end`,e.offset)}return e}currentLine(){return this.lines[this.pos]}parseNode(e){this.skipEmpty();let t=this.currentLine();return!t||t.indent<e?null:t.content.startsWith(`- `)||t.content===`-`?this.parseSequence(t.indent):this.isMapEntry(t.content)?this.parseMap(t.indent):(this.pos++,this.parseScalarValue(t.content,t.offset,t))}parseSequence(e){let t=this.currentLine(),n=new k([t.offset-t.indent,0,0]),r=t.offset;for(;this.pos<this.lines.length;){this.skipEmpty();let t=this.currentLine();if(!t||t.indent<e)break;if(t.indent>e){this.addError(`Bad indentation of a sequence entry`,t.offset);break}if(!t.content.startsWith(`- `)&&t.content!==`-`)break;let i=t.content===`-`?1:2,a=t.content.slice(i),o=t.offset+i;if(this.pos++,a===``||a.trim()===``){let t=this.parseNode(e+1);t&&(n.items.push(t),r=this.peekLastOffset())}else if(this.isMapEntry(a)){let s=this.parseInlineMap(a,o,e+i,t);n.items.push(s),r=s.range[2]}else{let e=this.parseScalarValue(a,o,t);n.items.push(e),r=e.range[2]}}return n.range[1]=r,n.range[2]=r,n}parseMap(e){let t=this.currentLine(),n=new O([t.offset-t.indent,0,0]),r=t.offset;for(;this.pos<this.lines.length;){this.skipEmpty();let t=this.currentLine();if(!t||t.indent<e)break;if(t.indent>e){this.addError(`Bad indentation of a mapping entry`,t.offset);break}if(!this.isMapEntry(t.content))break;let{key:i,valueStr:a,colonOffset:o,valueOffset:s}=this.splitMapEntry(t.content,t.offset),c=new D(i,[t.offset,t.offset+i.length,o]);this.pos++;let l;l=a===``?this.parseMapValue(e,o):this.parseScalarValue(a.trim(),s,t),n.items.push({key:c,value:l}),r=l?this.getNodeEnd(l):o+1}return n.range[1]=r,n.range[2]=r,n}parseInlineMap(e,t,n,r){let i=new O([t,0,0]),a=t,{key:o,valueStr:s,colonOffset:c,valueOffset:l}=this.splitMapEntry(e,t),u=new D(o,[t,t+o.length,c]),d;for(d=s===``?this.parseMapValue(n,c):this.parseScalarValue(s.trim(),l,r),i.items.push({key:u,value:d}),a=d?this.getNodeEnd(d):c+1;this.pos<this.lines.length;){this.skipEmpty();let e=this.currentLine();if(!e||e.indent<n||e.indent>n||!this.isMapEntry(e.content)||e.content.startsWith(`- `))break;let t=this.splitMapEntry(e.content,e.offset),r=new D(t.key,[e.offset,e.offset+t.key.length,t.colonOffset]);this.pos++;let o;o=t.valueStr===``?this.parseMapValue(n,t.colonOffset):this.parseScalarValue(t.valueStr.trim(),t.valueOffset,e),i.items.push({key:r,value:o}),a=o?this.getNodeEnd(o):t.colonOffset+1}return i.range[1]=a,i.range[2]=a,i}parseMapValue(e,t){this.skipEmpty();let n=this.currentLine();return!n||n.indent<e?new D(null,[t+1,t+1,t+1]):n.indent===e&&(n.content.startsWith(`- `)||n.content===`-`)?this.parseNode(e):n.indent>e?this.parseNode(e+1):new D(null,[t+1,t+1,t+1])}getNodeEnd(e){return e.range[2]}peekLastOffset(){if(this.pos>0&&this.pos<=this.lines.length){let e=this.lines[this.pos-1];return e.lineOffset+e.raw.length}return this.text.length}parseScalarValue(e,t,n){let r=e.trim(),i=t+e.indexOf(r),a=i+r.length,o=n.lineOffset+n.raw.length;return r.startsWith(`"`)?this.parseQuotedScalar(r,i,o):r===`true`||r===`false`?new D(r===`true`,[i,a,o]):r===`null`||r===`~`?new D(null,[i,a,o]):r!==``&&Me(r)?new D(Number(r),[i,a,o]):new D(r,[i,a,o])}parseQuotedScalar(e,t,n){let r=``,i=1;for(;i<e.length;){let a=e[i];if(a===`\\`){if(i++,i>=e.length){this.addError(`Unterminated double-quoted string`,t+i);break}let n=e[i];switch(n){case`n`:r+=`
|
|
4
4
|
`;break;case`t`:r+=` `;break;case`r`:r+=`\r`;break;case`"`:r+=`"`;break;case`\\`:r+=`\\`;break;case`/`:r+=`/`;break;default:r+=n}}else if(a===`"`){let e=t+i+1;return new D(r,[t,e,n])}else r+=a;i++}return this.addError(`Unterminated double-quoted string`,t),new D(r,[t,t+e.length,n])}skipEmpty(){for(;this.pos<this.lines.length&&this.lines[this.pos].content===``;)this.pos++}isMapEntry(e){return this.findMapColon(e)>=0}findMapColon(e){let t=!1,n=!1;for(let r=0;r<e.length;r++){let i=e[r];if(n){n=!1;continue}if(i===`\\`&&t){n=!0;continue}if(i===`"`){t=!t;continue}if(!t&&i===`:`&&(r+1>=e.length||e[r+1]===` `))return r}return-1}splitMapEntry(e,t){let n=this.findMapColon(e),r=e.slice(0,n).trim(),i=t+n,a=e.slice(n+1),o=a.trimStart(),s=i+1+(a.length-a.trimStart().length);return r.startsWith(`"`)&&r.endsWith(`"`)?{key:r.slice(1,-1),valueStr:o,colonOffset:i,valueOffset:s}:{key:r,valueStr:o,colonOffset:i,valueOffset:s}}addError(e,t){this.errors.push(new A(e,[t,t+1]))}};function Me(e){return e===``||e===`-`||e===`+`?!1:/^[+-]?(\d+\.?\d*|\.\d+)([eE][+-]?\d+)?$/.test(e)}function j(e){return Ne(e)?`"`+e.replace(/[\\"\x00-\x1f\x7f-\x9f]/g,e=>{switch(e){case`\\`:return`\\\\`;case`"`:return`\\"`;case`\b`:return`\\b`;case`\f`:return`\\f`;case`
|
package/dist/index.d.ts
CHANGED
|
@@ -70,6 +70,12 @@ interface SerializedLocator {
|
|
|
70
70
|
}
|
|
71
71
|
declare function defineBrowserCommand<T extends unknown[]>(fn: BrowserCommand<T>): BrowserCommand<T>;
|
|
72
72
|
|
|
73
|
+
/**
|
|
74
|
+
* The browser provider's `serverFactory`. Returns a `BrowserServerContribution`
|
|
75
|
+
* that Vitest core uses to build the SINGLE Vite server shared by `project.vite`
|
|
76
|
+
* and `project.browser.vite`. This factory does NOT create a server (core does);
|
|
77
|
+
* it only contributes config, plugins, the parent factory, and the RPC setup.
|
|
78
|
+
*/
|
|
73
79
|
declare const createBrowserServer: BrowserServerFactory;
|
|
74
80
|
declare function defineBrowserProvider<T extends object = object>(options: Omit<BrowserProviderOption<T>, "serverFactory" | "options"> & {
|
|
75
81
|
options?: T;
|