@untestutils/vitest 0.5.1 → 0.5.3
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/fixtures.d.mts +4 -2
- package/dist/fixtures.d.ts +3 -5
- package/dist/fixtures.d.ts.map +1 -1
- package/dist/fixtures.mjs +24 -19
- package/dist/global-setup.d.mts +1 -1
- package/dist/global-setup.d.ts +1 -1
- package/dist/global-setup.d.ts.map +1 -1
- package/dist/global-setup.mjs +26 -5
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/plugin.d.mts +46 -14
- package/dist/plugin.d.ts +46 -14
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.mjs +111 -32
- package/dist/provided-context.d.mts +20 -0
- package/dist/provided-context.d.ts +21 -0
- package/dist/provided-context.d.ts.map +1 -0
- package/dist/provided-context.mjs +2 -0
- package/dist/setup-file.d.mts +2 -1
- package/dist/setup-file.d.ts +4 -1
- package/dist/setup-file.d.ts.map +1 -1
- package/dist/setup-file.mjs +29 -4
- package/package.json +2 -2
package/dist/fixtures.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { APIRequestContext, BrowserContext, Page, Response } from "playwright-core";
|
|
1
|
+
import type { APIRequestContext, Browser, BrowserContext, Page, Response } from "playwright-core";
|
|
2
2
|
import { afterAll, afterEach, beforeAll, beforeEach, describe, type TestAPI } from "vitest";
|
|
3
3
|
import { type Recipe } from "@untestutils/core";
|
|
4
4
|
import { type HarnessBrowserName } from "./browsers.mjs";
|
|
@@ -8,8 +8,10 @@ export { HARNESS_BROWSER_NAMES, normalizeHarnessBrowsers, resolveHarnessBrowserN
|
|
|
8
8
|
export interface HarnessFixtures {
|
|
9
9
|
/** Recipe id or Recipe — set via `test.override({ harness: 'site' })`. */
|
|
10
10
|
harness: string | Recipe | undefined;
|
|
11
|
-
/** Playwright engine — from `UNTESTUTILS_BROWSER`
|
|
11
|
+
/** Playwright engine — from inject / `UNTESTUTILS_BROWSER` / plugin `browsers`. */
|
|
12
12
|
browserName: HarnessBrowserName;
|
|
13
|
+
/** Worker-scoped Playwright browser (one launch per worker). */
|
|
14
|
+
browser: Browser;
|
|
13
15
|
page: Page;
|
|
14
16
|
goto: (path: string, options?: Record<string, unknown>) => Promise<Response | null>;
|
|
15
17
|
baseURL: string;
|
package/dist/fixtures.d.ts
CHANGED
|
@@ -8,8 +8,10 @@ export { HARNESS_BROWSER_NAMES, normalizeHarnessBrowsers, resolveHarnessBrowserN
|
|
|
8
8
|
export interface HarnessFixtures {
|
|
9
9
|
/** Recipe id or Recipe — set via `test.override({ harness: 'site' })`. */
|
|
10
10
|
harness: string | Recipe | undefined;
|
|
11
|
-
/** Playwright engine — from `UNTESTUTILS_BROWSER`
|
|
11
|
+
/** Playwright engine — from inject / `UNTESTUTILS_BROWSER` / plugin `browsers`. */
|
|
12
12
|
browserName: HarnessBrowserName;
|
|
13
|
+
/** Worker-scoped Playwright browser (one launch per worker). */
|
|
14
|
+
browser: Browser;
|
|
13
15
|
page: Page;
|
|
14
16
|
goto: (path: string, options?: Record<string, unknown>) => Promise<Response | null>;
|
|
15
17
|
baseURL: string;
|
|
@@ -20,10 +22,6 @@ export declare const browserApi: {
|
|
|
20
22
|
launch: (name?: HarnessBrowserName) => Promise<Browser>;
|
|
21
23
|
};
|
|
22
24
|
/** @internal */
|
|
23
|
-
export declare function getBrowser(name?: HarnessBrowserName): Promise<Browser>;
|
|
24
|
-
/** @internal reset for tests */
|
|
25
|
-
export declare function resetBrowserPromise(): void;
|
|
26
|
-
/** @internal */
|
|
27
25
|
export declare function resolveBaseURL(): Promise<string>;
|
|
28
26
|
type CookieInput = Parameters<BrowserContext['addCookies']>[0][number];
|
|
29
27
|
type GotoFixture = (path: string, options?: Record<string, unknown>) => Promise<Response | null>;
|
package/dist/fixtures.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAClG,OAAO,EACL,QAAQ,EACR,SAAS,EACT,SAAS,EACT,UAAU,EACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"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"}
|
package/dist/fixtures.mjs
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { afterAll, afterEach, beforeAll, beforeEach, describe, test as base } from "vitest";
|
|
1
|
+
import { afterAll, afterEach, beforeAll, beforeEach, describe, inject, test as base } from "vitest";
|
|
2
2
|
import { getCurrentHarness, normalizeBaseUrl, useHarness } from "@untestutils/core";
|
|
3
3
|
import { resolveHarnessBrowserName } from "./browsers.mjs";
|
|
4
|
+
import { providedContextAugmentation } from "./provided-context.mjs";
|
|
5
|
+
void providedContextAugmentation;
|
|
4
6
|
export { afterAll, afterEach, beforeAll, beforeEach, describe };
|
|
5
7
|
export { HARNESS_BROWSER_NAMES, normalizeHarnessBrowsers, resolveHarnessBrowserName } from "./browsers.mjs";
|
|
6
|
-
const browserPromises = new Map();
|
|
7
8
|
|
|
8
9
|
export const browserApi = {
|
|
9
10
|
|
|
@@ -15,19 +16,12 @@ async launch(name = "chromium") {
|
|
|
15
16
|
}
|
|
16
17
|
return launcher.launch({ headless: true });
|
|
17
18
|
} };
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
browserPromises.set(browserName, p);
|
|
25
|
-
}
|
|
26
|
-
return p;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function resetBrowserPromise() {
|
|
30
|
-
browserPromises.clear();
|
|
19
|
+
function resolveBrowserNameFromInject() {
|
|
20
|
+
try {
|
|
21
|
+
const injected = inject("untestutilsBrowser");
|
|
22
|
+
if (injected) return injected;
|
|
23
|
+
} catch {}
|
|
24
|
+
return resolveHarnessBrowserName();
|
|
31
25
|
}
|
|
32
26
|
|
|
33
27
|
export async function resolveBaseURL() {
|
|
@@ -93,12 +87,13 @@ export async function waitForNuxt(page, mode) {
|
|
|
93
87
|
}
|
|
94
88
|
|
|
95
89
|
export async function usePageFixture(baseURL, use) {
|
|
96
|
-
const browser = await
|
|
90
|
+
const browser = await browserApi.launch();
|
|
97
91
|
const context = await browser.newContext({ baseURL });
|
|
98
92
|
patchContextCookies(context, baseURL);
|
|
99
93
|
const page = await context.newPage();
|
|
100
94
|
await use(page);
|
|
101
95
|
await context.close().catch(() => {});
|
|
96
|
+
await browser.close().catch(() => {});
|
|
102
97
|
}
|
|
103
98
|
|
|
104
99
|
export async function useRequestFixture(baseURL, use) {
|
|
@@ -123,11 +118,21 @@ export async function importExpectModule() {
|
|
|
123
118
|
}
|
|
124
119
|
export { expect } from "@playwright/test";
|
|
125
120
|
|
|
126
|
-
export const test = base.extend("harness", undefined).extend("browserName", () =>
|
|
121
|
+
export const test = base.extend("harness", undefined).extend("browserName", () => resolveBrowserNameFromInject()).extend(
|
|
122
|
+
"browser",
|
|
123
|
+
{ scope: "worker" },
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
async ({}, { onCleanup }) => {
|
|
127
|
+
const browserName = resolveBrowserNameFromInject();
|
|
128
|
+
const browser = await browserApi.launch(browserName);
|
|
129
|
+
onCleanup(() => browser.close().catch(() => {}));
|
|
130
|
+
return browser;
|
|
131
|
+
}
|
|
132
|
+
).extend("baseURL", async ({ harness }) => {
|
|
127
133
|
if (harness) await useHarness(harness);
|
|
128
134
|
return resolveBaseURL();
|
|
129
|
-
}).extend("page", async ({ baseURL,
|
|
130
|
-
const browser = await getBrowser(browserName);
|
|
135
|
+
}).extend("page", async ({ baseURL, browser }, { onCleanup }) => {
|
|
131
136
|
const context = await browser.newContext({ baseURL });
|
|
132
137
|
patchContextCookies(context, baseURL);
|
|
133
138
|
const page = await context.newPage();
|
package/dist/global-setup.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { TestProject } from "vitest/node";
|
|
2
|
-
export default function globalSetup(
|
|
2
|
+
export default function globalSetup(project: TestProject): Promise<() => Promise<void>>;
|
package/dist/global-setup.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { TestProject } from 'vitest/node';
|
|
2
|
-
export default function globalSetup(
|
|
2
|
+
export default function globalSetup(project: TestProject): Promise<() => Promise<void>>;
|
|
3
3
|
//# sourceMappingURL=global-setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-setup.d.ts","sourceRoot":"","sources":["../src/global-setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"global-setup.d.ts","sourceRoot":"","sources":["../src/global-setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AA8B/C,wBAA8B,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAyD5F"}
|
package/dist/global-setup.mjs
CHANGED
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
import { pathToFileURL } from "node:url";
|
|
2
2
|
import { ensurePrepared, stopAllTargets, reclaimStaleTargets, getRegisteredRecipe, listRegisteredRecipes, resolveArtifactsRoot, TargetRegistry, progress } from "@untestutils/core";
|
|
3
|
+
import { providedContextAugmentation } from "./provided-context.mjs";
|
|
4
|
+
void providedContextAugmentation;
|
|
3
5
|
async function loadRecipesModule() {
|
|
4
6
|
const mod = process.env.UNTESTUTILS_RECIPES_MODULE;
|
|
5
7
|
if (!mod) return;
|
|
6
8
|
await import(pathToFileURL(mod).href);
|
|
7
9
|
}
|
|
8
|
-
|
|
10
|
+
function readRegistryUrls(artifactsRoot, map) {
|
|
11
|
+
const urls = {};
|
|
12
|
+
for (const [id, entry] of Object.entries(map)) {
|
|
13
|
+
if (entry?.url) urls[id] = entry.url;
|
|
14
|
+
}
|
|
15
|
+
void artifactsRoot;
|
|
16
|
+
return urls;
|
|
17
|
+
}
|
|
18
|
+
export default async function globalSetup(project) {
|
|
9
19
|
await loadRecipesModule();
|
|
10
20
|
const artifactsRoot = resolveArtifactsRoot();
|
|
11
21
|
|
|
@@ -28,10 +38,21 @@ export default async function globalSetup(_project) {
|
|
|
28
38
|
}
|
|
29
39
|
progress.waveReady();
|
|
30
40
|
progress.massRun();
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
41
|
+
}
|
|
42
|
+
const registry = new TargetRegistry(artifactsRoot);
|
|
43
|
+
const map = await registry.read();
|
|
44
|
+
registry.applyAllToEnv(map);
|
|
45
|
+
const urls = readRegistryUrls(artifactsRoot, map);
|
|
46
|
+
const browsers = JSON.parse(process.env.UNTESTUTILS_BROWSERS || "[\"chromium\"]");
|
|
47
|
+
const payload = {
|
|
48
|
+
recipesModule: process.env.UNTESTUTILS_RECIPES_MODULE,
|
|
49
|
+
artifactsRoot,
|
|
50
|
+
session: process.env.UNTESTUTILS_SESSION,
|
|
51
|
+
browsers,
|
|
52
|
+
urls
|
|
53
|
+
};
|
|
54
|
+
if (typeof project?.provide === "function") {
|
|
55
|
+
project.provide("untestutils", payload);
|
|
35
56
|
}
|
|
36
57
|
void listRegisteredRecipes();
|
|
37
58
|
return async () => {
|
package/dist/index.d.mts
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* Config files must import the plugin from `untestutils/vitest/plugin`
|
|
4
4
|
* so `test.extend` is not evaluated during config load.
|
|
5
5
|
*/
|
|
6
|
-
export { untestutils } from "./plugin.mjs";
|
|
7
|
-
export type { UntestutilsPluginOptions } from "./plugin.mjs";
|
|
8
|
-
export { useHarness, defineRecipes, defineRecipe } from "@untestutils/core";
|
|
9
|
-
export type { HarnessHandle, Recipe } from "@untestutils/core";
|
|
6
|
+
export { untestutils, createVitestProjects } from "./plugin.mjs";
|
|
7
|
+
export type { UntestutilsPluginOptions, UntestutilsProvidedSession } from "./plugin.mjs";
|
|
8
|
+
export { useHarness, defineRecipes, defineRecipe, leaseTarget, prepareOnce, withHarness } from "@untestutils/core";
|
|
9
|
+
export type { HarnessHandle, Recipe, LeasedTarget } from "@untestutils/core";
|
|
10
10
|
export { describe, expect, test, beforeAll, afterAll, beforeEach, afterEach } from "./fixtures.mjs";
|
|
11
11
|
export type { HarnessFixtures, HarnessBrowserName } from "./fixtures.mjs";
|
|
12
12
|
export { HARNESS_BROWSER_NAMES, normalizeHarnessBrowsers, resolveHarnessBrowserName } from "./browsers.mjs";
|
package/dist/index.d.ts
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* Config files must import the plugin from `untestutils/vitest/plugin`
|
|
4
4
|
* so `test.extend` is not evaluated during config load.
|
|
5
5
|
*/
|
|
6
|
-
export { untestutils } from './plugin';
|
|
7
|
-
export type { UntestutilsPluginOptions } from './plugin';
|
|
8
|
-
export { useHarness, defineRecipes, defineRecipe } from '@untestutils/core';
|
|
9
|
-
export type { HarnessHandle, Recipe } from '@untestutils/core';
|
|
6
|
+
export { untestutils, createVitestProjects } from './plugin';
|
|
7
|
+
export type { UntestutilsPluginOptions, UntestutilsProvidedSession } from './plugin';
|
|
8
|
+
export { useHarness, defineRecipes, defineRecipe, leaseTarget, prepareOnce, withHarness, } from '@untestutils/core';
|
|
9
|
+
export type { HarnessHandle, Recipe, LeasedTarget } from '@untestutils/core';
|
|
10
10
|
export { describe, expect, test, beforeAll, afterAll, beforeEach, afterEach } from './fixtures';
|
|
11
11
|
export type { HarnessFixtures, HarnessBrowserName } from './fixtures';
|
|
12
12
|
export { HARNESS_BROWSER_NAMES, normalizeHarnessBrowsers, resolveHarnessBrowserName, } from './browsers';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC7D,YAAY,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AACrF,OAAO,EACL,UAAU,EACV,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAChG,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,YAAY,CAAC"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
export { untestutils } from "./plugin.mjs";
|
|
3
|
-
export { useHarness, defineRecipes, defineRecipe } from "@untestutils/core";
|
|
2
|
+
export { untestutils, createVitestProjects } from "./plugin.mjs";
|
|
3
|
+
export { useHarness, defineRecipes, defineRecipe, leaseTarget, prepareOnce, withHarness } from "@untestutils/core";
|
|
4
4
|
export { describe, expect, test, beforeAll, afterAll, beforeEach, afterEach } from "./fixtures.mjs";
|
|
5
5
|
export { HARNESS_BROWSER_NAMES, normalizeHarnessBrowsers, resolveHarnessBrowserName } from "./browsers.mjs";
|
package/dist/plugin.d.mts
CHANGED
|
@@ -5,6 +5,7 @@ export type { CreateCoverageConfigOptions, CoverageThresholds, UntestutilsCovera
|
|
|
5
5
|
export { createCoverageConfig, DEFAULT_COVERAGE_THRESHOLDS, UNTESTUTILS_WORKSPACE_PACKAGES } from "./coverage.mjs";
|
|
6
6
|
export type { HarnessBrowserName } from "./browsers.mjs";
|
|
7
7
|
export { HARNESS_BROWSER_NAMES, normalizeHarnessBrowsers, resolveHarnessBrowserName } from "./browsers.mjs";
|
|
8
|
+
export type { UntestutilsProvidedSession } from "./provided-context.mjs";
|
|
8
9
|
export interface UntestutilsPluginOptions {
|
|
9
10
|
/**
|
|
10
11
|
* Recipe map from `defineRecipes(...)` — import and pass it.
|
|
@@ -21,9 +22,14 @@ export interface UntestutilsPluginOptions {
|
|
|
21
22
|
/** Artifacts directory (sets `UNTESTUTILS_ARTIFACTS_DIR`). */
|
|
22
23
|
artifactsRoot?: string;
|
|
23
24
|
/**
|
|
25
|
+
* Isolate TargetRegistry / locks under `.untestutils/sessions/<session>/`
|
|
26
|
+
* so parallel Vitest + Playwright runs do not tear down each other's servers.
|
|
27
|
+
*/
|
|
28
|
+
session?: string;
|
|
29
|
+
/**
|
|
24
30
|
* Playwright engines for the `page` / `goto` fixtures.
|
|
25
|
-
* Default `['chromium']`.
|
|
26
|
-
*
|
|
31
|
+
* Default `['chromium']`. Multiple engines inject one Vitest project per browser
|
|
32
|
+
* via `injectTestProjects` (each provides `untestutilsBrowser`).
|
|
27
33
|
*/
|
|
28
34
|
browsers?: HarnessBrowserName[];
|
|
29
35
|
/**
|
|
@@ -32,22 +38,48 @@ export interface UntestutilsPluginOptions {
|
|
|
32
38
|
*/
|
|
33
39
|
coverage?: boolean | CreateCoverageConfigOptions;
|
|
34
40
|
}
|
|
41
|
+
type VitestConfigBag = Record<string, unknown> & {
|
|
42
|
+
sequence?: {
|
|
43
|
+
setupFiles?: string;
|
|
44
|
+
};
|
|
45
|
+
globalSetup?: string | string[];
|
|
46
|
+
setupFiles?: string | string[];
|
|
47
|
+
coverage?: UntestutilsCoverageConfig | Record<string, unknown>;
|
|
48
|
+
environment?: string;
|
|
49
|
+
provide?: Record<string, unknown>;
|
|
50
|
+
name?: string;
|
|
51
|
+
};
|
|
52
|
+
interface VitestPluginContextLike {
|
|
53
|
+
vitest: {
|
|
54
|
+
config: {
|
|
55
|
+
project?: string | string[];
|
|
56
|
+
};
|
|
57
|
+
projects: Array<{
|
|
58
|
+
name: string;
|
|
59
|
+
}>;
|
|
60
|
+
};
|
|
61
|
+
project: {
|
|
62
|
+
name: string;
|
|
63
|
+
config: VitestConfigBag;
|
|
64
|
+
provide: (key: string, value: unknown) => void;
|
|
65
|
+
};
|
|
66
|
+
injectTestProjects: (config: unknown | unknown[]) => Promise<Array<{
|
|
67
|
+
name: string;
|
|
68
|
+
}>>;
|
|
69
|
+
}
|
|
35
70
|
interface VitestPlugin {
|
|
36
71
|
name: string;
|
|
37
|
-
configureVitest?: (ctx:
|
|
38
|
-
project: {
|
|
39
|
-
config: Record<string, unknown> & {
|
|
40
|
-
sequence?: {
|
|
41
|
-
setupFiles?: string;
|
|
42
|
-
};
|
|
43
|
-
globalSetup?: string | string[];
|
|
44
|
-
setupFiles?: string | string[];
|
|
45
|
-
coverage?: UntestutilsCoverageConfig | Record<string, unknown>;
|
|
46
|
-
};
|
|
47
|
-
};
|
|
48
|
-
}) => void;
|
|
72
|
+
configureVitest?: (ctx: VitestPluginContextLike) => void | Promise<void>;
|
|
49
73
|
}
|
|
50
74
|
/**
|
|
51
75
|
* Vitest/Vite plugin — import from `untestutils/vitest/plugin` in vitest.config.
|
|
52
76
|
*/
|
|
53
77
|
export declare function untestutils(options?: UntestutilsPluginOptions): VitestPlugin;
|
|
78
|
+
/**
|
|
79
|
+
* Build separate Vitest project configs for e2e (recipe plugin) and Nuxt unit.
|
|
80
|
+
* Mixing both in one project throws — use this helper instead.
|
|
81
|
+
*/
|
|
82
|
+
export declare function createVitestProjects(opts: {
|
|
83
|
+
e2e?: Record<string, unknown>;
|
|
84
|
+
unit?: Record<string, unknown>;
|
|
85
|
+
}): Array<Record<string, unknown>>;
|
package/dist/plugin.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export type { CreateCoverageConfigOptions, CoverageThresholds, UntestutilsCovera
|
|
|
8
8
|
export { createCoverageConfig, DEFAULT_COVERAGE_THRESHOLDS, UNTESTUTILS_WORKSPACE_PACKAGES, } from './coverage';
|
|
9
9
|
export type { HarnessBrowserName } from './browsers';
|
|
10
10
|
export { HARNESS_BROWSER_NAMES, normalizeHarnessBrowsers, resolveHarnessBrowserName, } from './browsers';
|
|
11
|
+
export type { UntestutilsProvidedSession } from './provided-context';
|
|
11
12
|
export interface UntestutilsPluginOptions {
|
|
12
13
|
/**
|
|
13
14
|
* Recipe map from `defineRecipes(...)` — import and pass it.
|
|
@@ -23,10 +24,15 @@ export interface UntestutilsPluginOptions {
|
|
|
23
24
|
prewarm?: string[];
|
|
24
25
|
/** Artifacts directory (sets `UNTESTUTILS_ARTIFACTS_DIR`). */
|
|
25
26
|
artifactsRoot?: string;
|
|
27
|
+
/**
|
|
28
|
+
* Isolate TargetRegistry / locks under `.untestutils/sessions/<session>/`
|
|
29
|
+
* so parallel Vitest + Playwright runs do not tear down each other's servers.
|
|
30
|
+
*/
|
|
31
|
+
session?: string;
|
|
26
32
|
/**
|
|
27
33
|
* Playwright engines for the `page` / `goto` fixtures.
|
|
28
|
-
* Default `['chromium']`.
|
|
29
|
-
*
|
|
34
|
+
* Default `['chromium']`. Multiple engines inject one Vitest project per browser
|
|
35
|
+
* via `injectTestProjects` (each provides `untestutilsBrowser`).
|
|
30
36
|
*/
|
|
31
37
|
browsers?: HarnessBrowserName[];
|
|
32
38
|
/**
|
|
@@ -35,20 +41,38 @@ export interface UntestutilsPluginOptions {
|
|
|
35
41
|
*/
|
|
36
42
|
coverage?: boolean | CreateCoverageConfigOptions;
|
|
37
43
|
}
|
|
44
|
+
type VitestConfigBag = Record<string, unknown> & {
|
|
45
|
+
sequence?: {
|
|
46
|
+
setupFiles?: string;
|
|
47
|
+
};
|
|
48
|
+
globalSetup?: string | string[];
|
|
49
|
+
setupFiles?: string | string[];
|
|
50
|
+
coverage?: UntestutilsCoverageConfig | Record<string, unknown>;
|
|
51
|
+
environment?: string;
|
|
52
|
+
provide?: Record<string, unknown>;
|
|
53
|
+
name?: string;
|
|
54
|
+
};
|
|
55
|
+
interface VitestPluginContextLike {
|
|
56
|
+
vitest: {
|
|
57
|
+
config: {
|
|
58
|
+
project?: string | string[];
|
|
59
|
+
};
|
|
60
|
+
projects: Array<{
|
|
61
|
+
name: string;
|
|
62
|
+
}>;
|
|
63
|
+
};
|
|
64
|
+
project: {
|
|
65
|
+
name: string;
|
|
66
|
+
config: VitestConfigBag;
|
|
67
|
+
provide: (key: string, value: unknown) => void;
|
|
68
|
+
};
|
|
69
|
+
injectTestProjects: (config: unknown | unknown[]) => Promise<Array<{
|
|
70
|
+
name: string;
|
|
71
|
+
}>>;
|
|
72
|
+
}
|
|
38
73
|
interface VitestPlugin {
|
|
39
74
|
name: string;
|
|
40
|
-
configureVitest?: (ctx:
|
|
41
|
-
project: {
|
|
42
|
-
config: Record<string, unknown> & {
|
|
43
|
-
sequence?: {
|
|
44
|
-
setupFiles?: string;
|
|
45
|
-
};
|
|
46
|
-
globalSetup?: string | string[];
|
|
47
|
-
setupFiles?: string | string[];
|
|
48
|
-
coverage?: UntestutilsCoverageConfig | Record<string, unknown>;
|
|
49
|
-
};
|
|
50
|
-
};
|
|
51
|
-
}) => void;
|
|
75
|
+
configureVitest?: (ctx: VitestPluginContextLike) => void | Promise<void>;
|
|
52
76
|
}
|
|
53
77
|
/** @internal injectable fs/require for companion resolution tests */
|
|
54
78
|
export declare const companionIo: {
|
|
@@ -62,4 +86,12 @@ export declare function resolveCompanion(name: 'global-setup' | 'setup-file'): s
|
|
|
62
86
|
* Vitest/Vite plugin — import from `untestutils/vitest/plugin` in vitest.config.
|
|
63
87
|
*/
|
|
64
88
|
export declare function untestutils(options?: UntestutilsPluginOptions): VitestPlugin;
|
|
89
|
+
/**
|
|
90
|
+
* Build separate Vitest project configs for e2e (recipe plugin) and Nuxt unit.
|
|
91
|
+
* Mixing both in one project throws — use this helper instead.
|
|
92
|
+
*/
|
|
93
|
+
export declare function createVitestProjects(opts: {
|
|
94
|
+
e2e?: Record<string, unknown>;
|
|
95
|
+
unit?: Record<string, unknown>;
|
|
96
|
+
}): Array<Record<string, unknown>>;
|
|
65
97
|
//# sourceMappingURL=plugin.d.ts.map
|
package/dist/plugin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/plugin.mjs
CHANGED
|
@@ -2,9 +2,11 @@ import { existsSync } from "node:fs";
|
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
4
|
import { dirname, join } from "pathe";
|
|
5
|
-
import { ensureRecipes, debug, getRecipesModulePath } from "@untestutils/core";
|
|
5
|
+
import { ensureRecipes, debug, getRecipesModulePath, resolveSessionArtifactsRoot, sanitizeSession } from "@untestutils/core";
|
|
6
6
|
import { createCoverageConfig } from "./coverage.mjs";
|
|
7
7
|
import { normalizeHarnessBrowsers } from "./browsers.mjs";
|
|
8
|
+
import { providedContextAugmentation } from "./provided-context.mjs";
|
|
9
|
+
void providedContextAugmentation;
|
|
8
10
|
export { createCoverageConfig, DEFAULT_COVERAGE_THRESHOLDS, UNTESTUTILS_WORKSPACE_PACKAGES } from "./coverage.mjs";
|
|
9
11
|
export { HARNESS_BROWSER_NAMES, normalizeHarnessBrowsers, resolveHarnessBrowserName } from "./browsers.mjs";
|
|
10
12
|
|
|
@@ -37,51 +39,128 @@ export function resolveCompanion(name) {
|
|
|
37
39
|
if (companionIo.existsSync(localTs)) return localTs;
|
|
38
40
|
throw new Error(`[untestutils] missing companion ${name}`);
|
|
39
41
|
}
|
|
42
|
+
function wireProjectConfig(config, options, browsers, resolvedRoot, recipesModule) {
|
|
43
|
+
const env = config.environment;
|
|
44
|
+
if (env === "untestutils" || env === "nuxt") {
|
|
45
|
+
throw new Error("[untestutils] Do not mix `untestutils/vitest/plugin` (e2e) with `environment: 'untestutils'` (unit). Use separate Vitest projects.");
|
|
46
|
+
}
|
|
47
|
+
config.sequence ??= {};
|
|
48
|
+
config.sequence.setupFiles = "list";
|
|
49
|
+
config.globalSetup = [...asArray(config.globalSetup), companion("global-setup")];
|
|
50
|
+
config.setupFiles = [...asArray(config.setupFiles), companion("setup-file")];
|
|
51
|
+
if (options.coverage) {
|
|
52
|
+
const next = options.coverage === true ? createCoverageConfig() : createCoverageConfig(options.coverage);
|
|
53
|
+
config.coverage = {
|
|
54
|
+
...typeof config.coverage === "object" && config.coverage ? config.coverage : {},
|
|
55
|
+
...next,
|
|
56
|
+
exclude: [...config.coverage?.exclude ?? [], ...next.exclude],
|
|
57
|
+
include: next.include,
|
|
58
|
+
thresholds: {
|
|
59
|
+
...config.coverage?.thresholds ?? {},
|
|
60
|
+
...next.thresholds
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
process.env.UNTESTUTILS_PREWARM = JSON.stringify(options.prewarm ?? []);
|
|
65
|
+
process.env.UNTESTUTILS_BROWSERS = JSON.stringify(browsers);
|
|
66
|
+
if (!process.env.UNTESTUTILS_BROWSER) {
|
|
67
|
+
process.env.UNTESTUTILS_BROWSER = browsers[0];
|
|
68
|
+
}
|
|
69
|
+
process.env.UNTESTUTILS_ARTIFACTS_DIR = resolvedRoot;
|
|
70
|
+
if (options.session) process.env.UNTESTUTILS_SESSION = sanitizeSession(options.session);
|
|
71
|
+
if (recipesModule) {
|
|
72
|
+
process.env.UNTESTUTILS_RECIPES_MODULE = recipesModule;
|
|
73
|
+
} else if ((options.prewarm ?? []).length) {
|
|
74
|
+
debug("vitest", "prewarm set but recipes module path unknown — pass recipes from defineRecipes(..., import.meta.url)");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function sessionPayload(browsers, resolvedRoot, recipesModule, session) {
|
|
78
|
+
return {
|
|
79
|
+
recipesModule,
|
|
80
|
+
artifactsRoot: resolvedRoot,
|
|
81
|
+
session: session ? sanitizeSession(session) : undefined,
|
|
82
|
+
browsers,
|
|
83
|
+
urls: {}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
40
86
|
|
|
41
87
|
export function untestutils(options = {}) {
|
|
42
88
|
if (options.recipes) {
|
|
43
89
|
ensureRecipes(options.recipes);
|
|
44
90
|
}
|
|
45
|
-
const artifactsRoot = options.artifactsRoot;
|
|
46
|
-
const prewarm = options.prewarm ?? [];
|
|
47
|
-
const recipesModule = options.recipesModule ?? getRecipesModulePath();
|
|
48
91
|
const browsers = normalizeHarnessBrowsers(options.browsers);
|
|
92
|
+
const recipesModule = options.recipesModule ?? getRecipesModulePath();
|
|
93
|
+
const resolvedRoot = resolveSessionArtifactsRoot({
|
|
94
|
+
artifactsRoot: options.artifactsRoot,
|
|
95
|
+
session: options.session
|
|
96
|
+
});
|
|
49
97
|
return {
|
|
50
98
|
name: "untestutils",
|
|
51
|
-
configureVitest(
|
|
99
|
+
async configureVitest(ctx) {
|
|
100
|
+
const { project, vitest, injectTestProjects } = ctx;
|
|
52
101
|
const config = project.config;
|
|
53
|
-
config
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if (
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
thresholds: {
|
|
65
|
-
...config.coverage?.thresholds ?? {},
|
|
66
|
-
...next.thresholds
|
|
102
|
+
wireProjectConfig(config, options, browsers, resolvedRoot, recipesModule);
|
|
103
|
+
const payload = sessionPayload(browsers, resolvedRoot, recipesModule, options.session);
|
|
104
|
+
project.provide("untestutils", payload);
|
|
105
|
+
project.provide("untestutilsBrowser", browsers[0]);
|
|
106
|
+
if (browsers.length > 1 && typeof injectTestProjects === "function") {
|
|
107
|
+
const extras = browsers.slice(1);
|
|
108
|
+
for (const browser of extras) {
|
|
109
|
+
const name = `untestutils-${browser}`;
|
|
110
|
+
const filter = vitest.config.project;
|
|
111
|
+
if (Array.isArray(filter) && !filter.includes(name)) {
|
|
112
|
+
filter.push(name);
|
|
67
113
|
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (recipesModule) {
|
|
77
|
-
process.env.UNTESTUTILS_RECIPES_MODULE = recipesModule;
|
|
78
|
-
} else if (prewarm.length) {
|
|
79
|
-
debug("vitest", "prewarm set but recipes module path unknown — pass recipes from defineRecipes(..., import.meta.url)");
|
|
114
|
+
}
|
|
115
|
+
await injectTestProjects(extras.map((browser) => ({ test: {
|
|
116
|
+
name: `untestutils-${browser}`,
|
|
117
|
+
provide: {
|
|
118
|
+
untestutils: payload,
|
|
119
|
+
untestutilsBrowser: browser
|
|
120
|
+
}
|
|
121
|
+
} })));
|
|
80
122
|
}
|
|
81
|
-
debug("vitest", "configured globalSetup + setupFiles");
|
|
123
|
+
debug("vitest", "configured globalSetup + setupFiles + provide session");
|
|
82
124
|
}
|
|
83
125
|
};
|
|
84
126
|
}
|
|
127
|
+
|
|
128
|
+
export function createVitestProjects(opts) {
|
|
129
|
+
const projects = [];
|
|
130
|
+
if (opts.e2e) {
|
|
131
|
+
const test = opts.e2e.test ?? {};
|
|
132
|
+
if (test.environment === "untestutils" || test.environment === "nuxt") {
|
|
133
|
+
throw new Error("[untestutils] createVitestProjects({ e2e }) must not set environment: 'untestutils'. Put unit under { unit }.");
|
|
134
|
+
}
|
|
135
|
+
projects.push({
|
|
136
|
+
...opts.e2e,
|
|
137
|
+
test: {
|
|
138
|
+
name: "e2e",
|
|
139
|
+
...test
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if (opts.unit) {
|
|
144
|
+
const test = opts.unit.test ?? {};
|
|
145
|
+
const plugins = opts.unit.plugins ?? [];
|
|
146
|
+
const hasE2e = plugins.some((p) => typeof p === "object" && p !== null && "name" in p && p.name === "untestutils");
|
|
147
|
+
if (hasE2e) {
|
|
148
|
+
throw new Error("[untestutils] createVitestProjects({ unit }) must not include the e2e `untestutils()` plugin.");
|
|
149
|
+
}
|
|
150
|
+
projects.push({
|
|
151
|
+
...opts.unit,
|
|
152
|
+
test: {
|
|
153
|
+
name: "unit",
|
|
154
|
+
environment: "untestutils",
|
|
155
|
+
...test
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
if (!projects.length) {
|
|
160
|
+
throw new Error("[untestutils] createVitestProjects requires at least one of { e2e, unit }");
|
|
161
|
+
}
|
|
162
|
+
return projects;
|
|
163
|
+
}
|
|
85
164
|
function asArray(v) {
|
|
86
165
|
if (!v) return [];
|
|
87
166
|
return Array.isArray(v) ? v : [v];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializable harness session passed via Vitest `provide` / `inject`.
|
|
3
|
+
* Env vars remain a fallback for Playwright Test and CLI.
|
|
4
|
+
*/
|
|
5
|
+
export interface UntestutilsProvidedSession {
|
|
6
|
+
recipesModule?: string;
|
|
7
|
+
artifactsRoot: string;
|
|
8
|
+
session?: string;
|
|
9
|
+
browsers: Array<"chromium" | "firefox" | "webkit">;
|
|
10
|
+
/** Recipe id → live URL after globalSetup prewarm / registry apply. */
|
|
11
|
+
urls: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
declare module "vitest" {
|
|
14
|
+
interface ProvidedContext {
|
|
15
|
+
untestutils: UntestutilsProvidedSession;
|
|
16
|
+
untestutilsBrowser: "chromium" | "firefox" | "webkit";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Side-effect anchor so the `vitest` module augmentation is retained at runtime. */
|
|
20
|
+
export declare const providedContextAugmentation: boolean;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serializable harness session passed via Vitest `provide` / `inject`.
|
|
3
|
+
* Env vars remain a fallback for Playwright Test and CLI.
|
|
4
|
+
*/
|
|
5
|
+
export interface UntestutilsProvidedSession {
|
|
6
|
+
recipesModule?: string;
|
|
7
|
+
artifactsRoot: string;
|
|
8
|
+
session?: string;
|
|
9
|
+
browsers: Array<'chromium' | 'firefox' | 'webkit'>;
|
|
10
|
+
/** Recipe id → live URL after globalSetup prewarm / registry apply. */
|
|
11
|
+
urls: Record<string, string>;
|
|
12
|
+
}
|
|
13
|
+
declare module 'vitest' {
|
|
14
|
+
interface ProvidedContext {
|
|
15
|
+
untestutils: UntestutilsProvidedSession;
|
|
16
|
+
untestutilsBrowser: 'chromium' | 'firefox' | 'webkit';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Side-effect anchor so the `vitest` module augmentation is retained at runtime. */
|
|
20
|
+
export declare const providedContextAugmentation = true;
|
|
21
|
+
//# sourceMappingURL=provided-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provided-context.d.ts","sourceRoot":"","sources":["../src/provided-context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;IACnD,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,OAAO,QAAQ,QAAQ,CAAC;IACtB,UAAU,eAAe;QACvB,WAAW,EAAE,0BAA0B,CAAC;QACxC,kBAAkB,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;KACvD;CACF;AAED,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,OAAO,CAAC"}
|
package/dist/setup-file.d.mts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
/** Apply provided recipe URLs into process.env when keys are missing. */
|
|
2
|
+
export declare function applySessionUrls(urls: Record<string, string>): void;
|
package/dist/setup-file.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { type UntestutilsProvidedSession } from './provided-context';
|
|
2
|
+
/** Apply provided recipe URLs into process.env when keys are missing. */
|
|
3
|
+
export declare function applySessionUrls(urls: Record<string, string>): void;
|
|
1
4
|
/** @internal */
|
|
2
|
-
export declare function applyWorkerSetup(): Promise<void>;
|
|
5
|
+
export declare function applyWorkerSetup(sessionOverride?: UntestutilsProvidedSession): Promise<void>;
|
|
3
6
|
//# sourceMappingURL=setup-file.d.ts.map
|
package/dist/setup-file.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-file.d.ts","sourceRoot":"","sources":["../src/setup-file.ts"],"names":[],"mappings":"AAOA,gBAAgB;AAChB,wBAAsB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"setup-file.d.ts","sourceRoot":"","sources":["../src/setup-file.ts"],"names":[],"mappings":"AAOA,OAAO,EAA+B,KAAK,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAalG,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAKnE;AAED,gBAAgB;AAChB,wBAAsB,gBAAgB,CACpC,eAAe,CAAC,EAAE,0BAA0B,GAC3C,OAAO,CAAC,IAAI,CAAC,CAoBf"}
|
package/dist/setup-file.mjs
CHANGED
|
@@ -1,15 +1,40 @@
|
|
|
1
1
|
|
|
2
2
|
import { pathToFileURL } from "node:url";
|
|
3
|
-
import { resolveArtifactsRoot, TargetRegistry } from "@untestutils/core";
|
|
3
|
+
import { envKey, resolveArtifactsRoot, TargetRegistry } from "@untestutils/core";
|
|
4
|
+
import { providedContextAugmentation } from "./provided-context.mjs";
|
|
5
|
+
void providedContextAugmentation;
|
|
6
|
+
async function tryInjectSession() {
|
|
7
|
+
try {
|
|
8
|
+
const { inject } = await import("vitest");
|
|
9
|
+
return inject("untestutils");
|
|
10
|
+
} catch {
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function applySessionUrls(urls) {
|
|
16
|
+
for (const [id, url] of Object.entries(urls)) {
|
|
17
|
+
const key = envKey(id);
|
|
18
|
+
if (!process.env[key]) process.env[key] = url;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
4
21
|
|
|
5
|
-
export async function applyWorkerSetup() {
|
|
6
|
-
const
|
|
22
|
+
export async function applyWorkerSetup(sessionOverride) {
|
|
23
|
+
const session = sessionOverride ?? await tryInjectSession();
|
|
24
|
+
const recipesModule = session?.recipesModule ?? process.env.UNTESTUTILS_RECIPES_MODULE;
|
|
7
25
|
if (recipesModule) {
|
|
8
26
|
await import(pathToFileURL(recipesModule).href);
|
|
27
|
+
if (!process.env.UNTESTUTILS_RECIPES_MODULE) {
|
|
28
|
+
process.env.UNTESTUTILS_RECIPES_MODULE = recipesModule;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const artifactsRoot = session?.artifactsRoot ?? resolveArtifactsRoot();
|
|
32
|
+
if (session?.artifactsRoot && !process.env.UNTESTUTILS_ARTIFACTS_DIR) {
|
|
33
|
+
process.env.UNTESTUTILS_ARTIFACTS_DIR = session.artifactsRoot;
|
|
9
34
|
}
|
|
10
|
-
const artifactsRoot = resolveArtifactsRoot();
|
|
11
35
|
const registry = new TargetRegistry(artifactsRoot);
|
|
12
36
|
const map = await registry.read();
|
|
13
37
|
registry.applyAllToEnv(map);
|
|
38
|
+
if (session?.urls) applySessionUrls(session.urls);
|
|
14
39
|
}
|
|
15
40
|
await applyWorkerSetup();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@untestutils/vitest",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.3",
|
|
4
4
|
"homepage": "https://s00d.github.io/untestutils/",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"pathe": "^2.0.3",
|
|
48
|
-
"@untestutils/core": "0.5.
|
|
48
|
+
"@untestutils/core": "0.5.3"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@types/node": "^26.6.1",
|