@interfere/test-utils 1.0.0 → 9.0.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/lib/tags.d.mts +6 -0
- package/dist/lib/tags.d.mts.map +1 -0
- package/dist/lib/tags.mjs +6 -0
- package/dist/lib/tags.mjs.map +1 -0
- package/dist/lib/viewports.d.mts +14 -0
- package/dist/lib/viewports.d.mts.map +1 -0
- package/dist/lib/viewports.mjs +11 -0
- package/dist/lib/viewports.mjs.map +1 -0
- package/dist/playwright/base.d.mts +46 -0
- package/dist/playwright/base.d.mts.map +1 -0
- package/dist/playwright/base.mjs +32 -0
- package/dist/playwright/base.mjs.map +1 -0
- package/dist/playwright/define-config.d.mts +6 -0
- package/dist/playwright/define-config.d.mts.map +1 -0
- package/dist/playwright/define-config.mjs +9 -0
- package/dist/playwright/define-config.mjs.map +1 -0
- package/dist/vitest/base.d.mts +43 -0
- package/dist/vitest/base.d.mts.map +1 -0
- package/dist/vitest/base.mjs +57 -0
- package/dist/vitest/base.mjs.map +1 -0
- package/dist/vitest/define-config.d.mts +6 -0
- package/dist/vitest/define-config.d.mts.map +1 -0
- package/dist/vitest/define-config.mjs +9 -0
- package/dist/vitest/define-config.mjs.map +1 -0
- package/dist/vitest/msw-browser.d.mts +7 -0
- package/dist/vitest/msw-browser.d.mts.map +1 -0
- package/dist/vitest/msw-browser.mjs +20 -0
- package/dist/vitest/msw-browser.mjs.map +1 -0
- package/dist/vitest/msw-http.d.mts +15 -0
- package/dist/vitest/msw-http.d.mts.map +1 -0
- package/dist/vitest/msw-http.mjs +33 -0
- package/dist/vitest/msw-http.mjs.map +1 -0
- package/dist/vitest/presets/browser.d.mts +29 -0
- package/dist/vitest/presets/browser.d.mts.map +1 -0
- package/dist/vitest/presets/browser.mjs +60 -0
- package/dist/vitest/presets/browser.mjs.map +1 -0
- package/dist/vitest/presets/node.d.mts +15 -0
- package/dist/vitest/presets/node.d.mts.map +1 -0
- package/dist/vitest/presets/node.mjs +26 -0
- package/dist/vitest/presets/node.mjs.map +1 -0
- package/package.json +71 -11
- package/.turbo/turbo-typecheck.log +0 -2
- package/src/lib/deep-merge.ts +0 -71
- package/src/lib/tags.ts +0 -3
- package/src/lib/viewports.ts +0 -6
- package/src/playwright/base.ts +0 -44
- package/src/playwright/define-config.ts +0 -13
- package/src/vitest/base.ts +0 -50
- package/src/vitest/define-config.ts +0 -13
- package/src/vitest/msw-browser.ts +0 -18
- package/src/vitest/msw-http.ts +0 -60
- package/src/vitest/presets/browser.ts +0 -55
- package/src/vitest/presets/node.ts +0 -23
- package/tsconfig.json +0 -10
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.d.mts","names":[],"sources":["../../src/lib/tags.ts"],"mappings":";cAAa,MAAA;AAAA,cACA,OAAA;AAAA,cACA,MAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags.mjs","names":[],"sources":["../../src/lib/tags.ts"],"sourcesContent":["export const COMMON = \"@common\" as const;\nexport const DESKTOP = \"@desktop\" as const;\nexport const MOBILE = \"@mobile\" as const;\n"],"mappings":";AAAA,MAAa,SAAS;AACtB,MAAa,UAAU;AACvB,MAAa,SAAS"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { TestUserConfig } from "vitest/config";
|
|
2
|
+
|
|
3
|
+
//#region src/lib/viewports.d.ts
|
|
4
|
+
type Viewport = NonNullable<TestUserConfig["browser"]>["viewport"];
|
|
5
|
+
declare const DESKTOP: {
|
|
6
|
+
readonly width: 1280;
|
|
7
|
+
readonly height: 720;
|
|
8
|
+
};
|
|
9
|
+
declare const MOBILE: {
|
|
10
|
+
readonly width: 390;
|
|
11
|
+
readonly height: 844;
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { DESKTOP, MOBILE, Viewport };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewports.d.mts","names":[],"sources":["../../src/lib/viewports.ts"],"mappings":";;;KAEY,QAAA,GAAW,WAAA,CAAY,cAAA;AAAA,cAEtB,OAAA;EAAA,SAAkE,KAAA;EAAA,SAAA,MAAA;AAAA;AAAA,cAClE,MAAA;EAAA,SAAgE,KAAA;EAAA,SAAA,MAAA;AAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewports.mjs","names":[],"sources":["../../src/lib/viewports.ts"],"sourcesContent":["import type { TestUserConfig } from \"vitest/config\";\n\nexport type Viewport = NonNullable<TestUserConfig[\"browser\"]>[\"viewport\"];\n\nexport const DESKTOP = { width: 1280, height: 720 } as const satisfies Viewport;\nexport const MOBILE = { width: 390, height: 844 } as const satisfies Viewport;\n"],"mappings":";AAIA,MAAa,UAAU;CAAE,OAAO;CAAM,QAAQ;CAAK;AACnD,MAAa,SAAS;CAAE,OAAO;CAAK,QAAQ;CAAK"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as _$_playwright_test0 from "@playwright/test";
|
|
2
|
+
|
|
3
|
+
//#region src/playwright/base.d.ts
|
|
4
|
+
declare const _default: {
|
|
5
|
+
fullyParallel: true;
|
|
6
|
+
forbidOnly: boolean;
|
|
7
|
+
reporter: ["html"][] | (["github"] | ["junit", {
|
|
8
|
+
outputFile: string;
|
|
9
|
+
}])[];
|
|
10
|
+
use: {
|
|
11
|
+
trace: "on-first-retry";
|
|
12
|
+
screenshot: "only-on-failure";
|
|
13
|
+
actionTimeout?: number;
|
|
14
|
+
};
|
|
15
|
+
expect?: {
|
|
16
|
+
timeout: number;
|
|
17
|
+
};
|
|
18
|
+
projects: ({
|
|
19
|
+
name: string;
|
|
20
|
+
grep: RegExp;
|
|
21
|
+
use: {
|
|
22
|
+
viewport: _$_playwright_test0.ViewportSize;
|
|
23
|
+
userAgent: string;
|
|
24
|
+
deviceScaleFactor: number;
|
|
25
|
+
isMobile: boolean;
|
|
26
|
+
hasTouch: boolean;
|
|
27
|
+
defaultBrowserType: "chromium" | "firefox" | "webkit";
|
|
28
|
+
};
|
|
29
|
+
} | {
|
|
30
|
+
name: string;
|
|
31
|
+
grep: RegExp;
|
|
32
|
+
use: {
|
|
33
|
+
userAgent: string;
|
|
34
|
+
deviceScaleFactor: number;
|
|
35
|
+
defaultBrowserType: "chromium" | "firefox" | "webkit";
|
|
36
|
+
viewport: {
|
|
37
|
+
readonly width: 390;
|
|
38
|
+
readonly height: 844;
|
|
39
|
+
};
|
|
40
|
+
isMobile: true;
|
|
41
|
+
hasTouch: true;
|
|
42
|
+
};
|
|
43
|
+
})[];
|
|
44
|
+
};
|
|
45
|
+
//#endregion
|
|
46
|
+
export { _default as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.mts","names":[],"sources":["../../src/playwright/base.ts"],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { COMMON, DESKTOP, MOBILE } from "../lib/tags.mjs";
|
|
2
|
+
import { MOBILE as MOBILE$1 } from "../lib/viewports.mjs";
|
|
3
|
+
import { devices } from "@playwright/test";
|
|
4
|
+
//#region src/playwright/base.ts
|
|
5
|
+
const ci = !!process.env["CI"];
|
|
6
|
+
var base_default = {
|
|
7
|
+
fullyParallel: true,
|
|
8
|
+
forbidOnly: ci,
|
|
9
|
+
reporter: ci ? [["github"], ["junit", { outputFile: "./test-results/e2e-junit.xml" }]] : [["html"]],
|
|
10
|
+
use: {
|
|
11
|
+
trace: "on-first-retry",
|
|
12
|
+
screenshot: "only-on-failure",
|
|
13
|
+
...ci && { actionTimeout: 1e4 }
|
|
14
|
+
},
|
|
15
|
+
...ci && { expect: { timeout: 1e4 } },
|
|
16
|
+
projects: [{
|
|
17
|
+
name: "desktop",
|
|
18
|
+
grep: new RegExp(`${DESKTOP}|${COMMON}`),
|
|
19
|
+
use: { ...devices["Desktop Chrome"] }
|
|
20
|
+
}, {
|
|
21
|
+
name: "mobile",
|
|
22
|
+
grep: new RegExp(`${MOBILE}|${COMMON}`),
|
|
23
|
+
use: {
|
|
24
|
+
...devices["Desktop Chrome"],
|
|
25
|
+
viewport: MOBILE$1,
|
|
26
|
+
isMobile: true,
|
|
27
|
+
hasTouch: true
|
|
28
|
+
}
|
|
29
|
+
}]
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export { base_default as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.mjs","names":["MOBILE_TAG","MOBILE"],"sources":["../../src/playwright/base.ts"],"sourcesContent":["import { devices, type PlaywrightTestConfig } from \"@playwright/test\";\n\nimport { COMMON, DESKTOP, MOBILE as MOBILE_TAG } from \"../lib/tags.js\";\nimport { MOBILE } from \"../lib/viewports.js\";\n\nconst ci = !!process.env[\"CI\"];\n\nexport default {\n fullyParallel: true,\n forbidOnly: ci,\n reporter: ci\n ? [[\"github\"], [\"junit\", { outputFile: \"./test-results/e2e-junit.xml\" }]]\n : [[\"html\"]],\n\n use: {\n trace: \"on-first-retry\",\n screenshot: \"only-on-failure\",\n ...(ci && {\n actionTimeout: 10_000,\n }),\n },\n\n ...(ci && {\n expect: { timeout: 10_000 },\n }),\n\n projects: [\n {\n name: \"desktop\",\n grep: new RegExp(`${DESKTOP}|${COMMON}`),\n use: { ...devices[\"Desktop Chrome\"] },\n },\n {\n name: \"mobile\",\n grep: new RegExp(`${MOBILE_TAG}|${COMMON}`),\n use: {\n ...devices[\"Desktop Chrome\"],\n viewport: MOBILE,\n isMobile: true,\n hasTouch: true,\n },\n },\n ],\n} satisfies PlaywrightTestConfig;\n"],"mappings":";;;;AAKA,MAAM,KAAK,CAAC,CAAC,QAAQ,IAAI;AAEzB,IAAA,eAAe;CACb,eAAe;CACf,YAAY;CACZ,UAAU,KACN,CAAC,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,YAAY,gCAAgC,CAAC,CAAC,GACvE,CAAC,CAAC,OAAO,CAAC;CAEd,KAAK;EACH,OAAO;EACP,YAAY;EACZ,GAAI,MAAM,EACR,eAAe,KAChB;EACF;CAED,GAAI,MAAM,EACR,QAAQ,EAAE,SAAS,KAAQ,EAC5B;CAED,UAAU,CACR;EACE,MAAM;EACN,MAAM,IAAI,OAAO,GAAG,QAAQ,GAAG,SAAS;EACxC,KAAK,EAAE,GAAG,QAAQ,mBAAmB;EACtC,EACD;EACE,MAAM;EACN,MAAM,IAAI,OAAO,GAAGA,OAAW,GAAG,SAAS;EAC3C,KAAK;GACH,GAAG,QAAQ;GACX,UAAUC;GACV,UAAU;GACV,UAAU;GACX;EACF,CACF;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { PlaywrightTestConfig } from "@playwright/test";
|
|
2
|
+
|
|
3
|
+
//#region src/playwright/define-config.d.ts
|
|
4
|
+
declare function defineConfig(...overrides: Array<Partial<PlaywrightTestConfig> | undefined>): PlaywrightTestConfig<{}, {}>;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { defineConfig };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.d.mts","names":[],"sources":["../../src/playwright/define-config.ts"],"mappings":";;;iBASgB,YAAA,CAAA,GACX,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,oBAAA,iBAAkC,oBAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import base_default from "./base.mjs";
|
|
2
|
+
import { defineConfig as defineConfig$1 } from "@playwright/test";
|
|
3
|
+
import { deepMerge } from "@interfere/helpers/deep-merge";
|
|
4
|
+
//#region src/playwright/define-config.ts
|
|
5
|
+
function defineConfig(...overrides) {
|
|
6
|
+
return defineConfig$1(deepMerge(base_default, ...overrides));
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { defineConfig };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.mjs","names":["pwDefineConfig","base"],"sources":["../../src/playwright/define-config.ts"],"sourcesContent":["import { deepMerge } from \"@interfere/helpers/deep-merge\";\n\nimport {\n type PlaywrightTestConfig,\n defineConfig as pwDefineConfig,\n} from \"@playwright/test\";\n\nimport base from \"./base.js\";\n\nexport function defineConfig(\n ...overrides: Array<Partial<PlaywrightTestConfig> | undefined>\n) {\n return pwDefineConfig(deepMerge<PlaywrightTestConfig>(base, ...overrides));\n}\n"],"mappings":";;;;AASA,SAAgB,aACd,GAAG,WACH;AACA,QAAOA,eAAe,UAAgCC,cAAM,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/vitest/base.d.ts
|
|
2
|
+
declare const _default: {
|
|
3
|
+
root: string;
|
|
4
|
+
resolve: {
|
|
5
|
+
conditions: string[];
|
|
6
|
+
};
|
|
7
|
+
ssr: {
|
|
8
|
+
resolve: {
|
|
9
|
+
conditions: string[];
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
test: {
|
|
13
|
+
env: {
|
|
14
|
+
NODE_ENV: string;
|
|
15
|
+
};
|
|
16
|
+
environment: "node";
|
|
17
|
+
globals: true;
|
|
18
|
+
isolate: true;
|
|
19
|
+
pool: "forks";
|
|
20
|
+
maxWorkers: string;
|
|
21
|
+
clearMocks: true;
|
|
22
|
+
restoreMocks: true;
|
|
23
|
+
unstubEnvs: true;
|
|
24
|
+
unstubGlobals: true;
|
|
25
|
+
sequence: {
|
|
26
|
+
shuffle: boolean;
|
|
27
|
+
};
|
|
28
|
+
include: string[];
|
|
29
|
+
exclude: string[];
|
|
30
|
+
reporters: ("default" | "junit")[];
|
|
31
|
+
coverage: {
|
|
32
|
+
include: string[];
|
|
33
|
+
exclude: string[];
|
|
34
|
+
reporter: ("json" | "json-summary" | "lcov")[] | ("clover" | "html" | "json" | "text")[];
|
|
35
|
+
};
|
|
36
|
+
setupFiles?: string[];
|
|
37
|
+
outputFile?: {
|
|
38
|
+
junit: string;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
//#endregion
|
|
43
|
+
export { _default as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.mts","names":[],"sources":["../../src/vitest/base.ts"],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { omitUndefined } from "@interfere/helpers/omit-undefined";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { config } from "dotenv";
|
|
5
|
+
import { configDefaults } from "vitest/config";
|
|
6
|
+
//#region src/vitest/base.ts
|
|
7
|
+
const root = process.cwd();
|
|
8
|
+
const isCI = Boolean(process.env["CI"]);
|
|
9
|
+
const env = config({
|
|
10
|
+
path: resolve(root, ".env.test"),
|
|
11
|
+
quiet: true
|
|
12
|
+
}).parsed ?? {};
|
|
13
|
+
const setupFiles = ["./test/setup.ts", "./test/unit/setup.ts"].filter((rel) => existsSync(resolve(root, rel)));
|
|
14
|
+
var base_default = {
|
|
15
|
+
root,
|
|
16
|
+
resolve: { conditions: ["@source"] },
|
|
17
|
+
ssr: { resolve: { conditions: ["@source"] } },
|
|
18
|
+
test: {
|
|
19
|
+
env: {
|
|
20
|
+
...env,
|
|
21
|
+
NODE_ENV: "test"
|
|
22
|
+
},
|
|
23
|
+
environment: "node",
|
|
24
|
+
globals: true,
|
|
25
|
+
isolate: true,
|
|
26
|
+
pool: "forks",
|
|
27
|
+
maxWorkers: "50%",
|
|
28
|
+
clearMocks: true,
|
|
29
|
+
restoreMocks: true,
|
|
30
|
+
unstubEnvs: true,
|
|
31
|
+
unstubGlobals: true,
|
|
32
|
+
sequence: { shuffle: !isCI },
|
|
33
|
+
include: ["src/**/*.{test,spec}.?(c|m)[jt]s?(x)", "test/**/*.{test,spec}.?(c|m)[jt]s?(x)"],
|
|
34
|
+
exclude: ["test/e2e/**/*.{test,spec}.?(c|m)[jt]s?(x)", ...configDefaults.exclude],
|
|
35
|
+
reporters: isCI ? ["default", "junit"] : ["default"],
|
|
36
|
+
coverage: {
|
|
37
|
+
include: ["src/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs}"],
|
|
38
|
+
exclude: [...configDefaults.coverage?.exclude ?? []],
|
|
39
|
+
reporter: isCI ? [
|
|
40
|
+
"json",
|
|
41
|
+
"json-summary",
|
|
42
|
+
"lcov"
|
|
43
|
+
] : [
|
|
44
|
+
"text",
|
|
45
|
+
"html",
|
|
46
|
+
"clover",
|
|
47
|
+
"json"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
...omitUndefined({
|
|
51
|
+
setupFiles: setupFiles.length > 0 ? setupFiles : void 0,
|
|
52
|
+
outputFile: isCI ? { junit: "./test-results/junit.xml" } : void 0
|
|
53
|
+
})
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
//#endregion
|
|
57
|
+
export { base_default as default };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.mjs","names":[],"sources":["../../src/vitest/base.ts"],"sourcesContent":["import { omitUndefined } from \"@interfere/helpers/omit-undefined\";\n\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { config } from \"dotenv\";\nimport { configDefaults, type ViteUserConfig } from \"vitest/config\";\n\nconst root = process.cwd();\nconst isCI = Boolean(process.env[\"CI\"]);\n\nconst env =\n config({ path: resolve(root, \".env.test\"), quiet: true }).parsed ?? {};\n\nconst setupFiles = [\"./test/setup.ts\", \"./test/unit/setup.ts\"].filter((rel) =>\n existsSync(resolve(root, rel))\n);\n\nexport default {\n root,\n resolve: { conditions: [\"@source\"] },\n ssr: { resolve: { conditions: [\"@source\"] } },\n test: {\n env: { ...env, NODE_ENV: \"test\" },\n environment: \"node\",\n globals: true,\n isolate: true,\n pool: \"forks\",\n maxWorkers: \"50%\",\n clearMocks: true,\n restoreMocks: true,\n unstubEnvs: true,\n unstubGlobals: true,\n sequence: { shuffle: !isCI },\n include: [\n \"src/**/*.{test,spec}.?(c|m)[jt]s?(x)\",\n \"test/**/*.{test,spec}.?(c|m)[jt]s?(x)\",\n ],\n exclude: [\n \"test/e2e/**/*.{test,spec}.?(c|m)[jt]s?(x)\",\n ...configDefaults.exclude,\n ],\n reporters: isCI ? [\"default\", \"junit\"] : [\"default\"],\n coverage: {\n include: [\"src/**/*.{ts,tsx,js,jsx,mts,cts,mjs,cjs}\"],\n exclude: [...(configDefaults.coverage?.exclude ?? [])],\n reporter: isCI\n ? [\"json\", \"json-summary\", \"lcov\"]\n : [\"text\", \"html\", \"clover\", \"json\"],\n },\n ...omitUndefined({\n setupFiles: setupFiles.length > 0 ? setupFiles : undefined,\n outputFile: isCI ? { junit: \"./test-results/junit.xml\" } : undefined,\n }),\n },\n} satisfies ViteUserConfig;\n"],"mappings":";;;;;;AAOA,MAAM,OAAO,QAAQ,KAAK;AAC1B,MAAM,OAAO,QAAQ,QAAQ,IAAI,MAAM;AAEvC,MAAM,MACJ,OAAO;CAAE,MAAM,QAAQ,MAAM,YAAY;CAAE,OAAO;CAAM,CAAC,CAAC,UAAU,EAAE;AAExE,MAAM,aAAa,CAAC,mBAAmB,uBAAuB,CAAC,QAAQ,QACrE,WAAW,QAAQ,MAAM,IAAI,CAAC,CAC/B;AAED,IAAA,eAAe;CACb;CACA,SAAS,EAAE,YAAY,CAAC,UAAU,EAAE;CACpC,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,UAAU,EAAE,EAAE;CAC7C,MAAM;EACJ,KAAK;GAAE,GAAG;GAAK,UAAU;GAAQ;EACjC,aAAa;EACb,SAAS;EACT,SAAS;EACT,MAAM;EACN,YAAY;EACZ,YAAY;EACZ,cAAc;EACd,YAAY;EACZ,eAAe;EACf,UAAU,EAAE,SAAS,CAAC,MAAM;EAC5B,SAAS,CACP,wCACA,wCACD;EACD,SAAS,CACP,6CACA,GAAG,eAAe,QACnB;EACD,WAAW,OAAO,CAAC,WAAW,QAAQ,GAAG,CAAC,UAAU;EACpD,UAAU;GACR,SAAS,CAAC,2CAA2C;GACrD,SAAS,CAAC,GAAI,eAAe,UAAU,WAAW,EAAE,CAAE;GACtD,UAAU,OACN;IAAC;IAAQ;IAAgB;IAAO,GAChC;IAAC;IAAQ;IAAQ;IAAU;IAAO;GACvC;EACD,GAAG,cAAc;GACf,YAAY,WAAW,SAAS,IAAI,aAAa,KAAA;GACjD,YAAY,OAAO,EAAE,OAAO,4BAA4B,GAAG,KAAA;GAC5D,CAAC;EACH;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.d.mts","names":[],"sources":["../../src/vitest/define-config.ts"],"mappings":";;;iBASgB,YAAA,CAAA,GACX,SAAA,EAAW,KAAA,CAAM,OAAA,CAAQ,cAAA,iBAA4B,cAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import base_default from "./base.mjs";
|
|
2
|
+
import { deepMerge } from "@interfere/helpers/deep-merge";
|
|
3
|
+
import { defineConfig as defineConfig$1 } from "vitest/config";
|
|
4
|
+
//#region src/vitest/define-config.ts
|
|
5
|
+
function defineConfig(...overrides) {
|
|
6
|
+
return defineConfig$1(deepMerge(base_default, ...overrides));
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { defineConfig };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-config.mjs","names":["vitestDefineConfig","base"],"sources":["../../src/vitest/define-config.ts"],"sourcesContent":["import { deepMerge } from \"@interfere/helpers/deep-merge\";\n\nimport {\n type ViteUserConfig,\n defineConfig as vitestDefineConfig,\n} from \"vitest/config\";\n\nimport base from \"./base.js\";\n\nexport function defineConfig(\n ...overrides: Array<Partial<ViteUserConfig> | undefined>\n) {\n return vitestDefineConfig(deepMerge<ViteUserConfig>(base, ...overrides));\n}\n"],"mappings":";;;;AASA,SAAgB,aACd,GAAG,WACH;AACA,QAAOA,eAAmB,UAA0BC,cAAM,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"msw-browser.d.mts","names":[],"sources":["../../src/vitest/msw-browser.ts"],"mappings":";;;cAGa,MAAA,EAAsB,cAAA,CAAhB,WAAA;AAAA,iBAEH,SAAA,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { setupWorker } from "msw/browser";
|
|
2
|
+
import { afterAll, afterEach, beforeAll } from "vitest";
|
|
3
|
+
//#region src/vitest/msw-browser.ts
|
|
4
|
+
const worker = setupWorker();
|
|
5
|
+
function enableMSW() {
|
|
6
|
+
beforeAll(async () => {
|
|
7
|
+
await worker.start({
|
|
8
|
+
onUnhandledRequest: "bypass",
|
|
9
|
+
quiet: true
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
worker.resetHandlers();
|
|
14
|
+
});
|
|
15
|
+
afterAll(() => {
|
|
16
|
+
worker.stop();
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { enableMSW, worker };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"msw-browser.mjs","names":[],"sources":["../../src/vitest/msw-browser.ts"],"sourcesContent":["import { setupWorker } from \"msw/browser\";\nimport { afterAll, afterEach, beforeAll } from \"vitest\";\n\nexport const worker = setupWorker();\n\nexport function enableMSW(): void {\n beforeAll(async () => {\n await worker.start({ onUnhandledRequest: \"bypass\", quiet: true });\n });\n\n afterEach(() => {\n worker.resetHandlers();\n });\n\n afterAll(() => {\n worker.stop();\n });\n}\n"],"mappings":";;;AAGA,MAAa,SAAS,aAAa;AAEnC,SAAgB,YAAkB;AAChC,WAAU,YAAY;AACpB,QAAM,OAAO,MAAM;GAAE,oBAAoB;GAAU,OAAO;GAAM,CAAC;GACjE;AAEF,iBAAgB;AACd,SAAO,eAAe;GACtB;AAEF,gBAAe;AACb,SAAO,MAAM;GACb"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/vitest/msw-http.d.ts
|
|
2
|
+
type HttpMethod = "post" | "get" | "put" | "delete" | "patch";
|
|
3
|
+
type JsonValue = string | number | boolean | null | JsonValue[] | {
|
|
4
|
+
[key: string]: JsonValue;
|
|
5
|
+
};
|
|
6
|
+
interface CapturedHttpCall {
|
|
7
|
+
body: unknown;
|
|
8
|
+
params: Record<string, string | readonly string[] | undefined>;
|
|
9
|
+
}
|
|
10
|
+
declare function createHttpInterceptor(baseUrl: string): {
|
|
11
|
+
intercept: (method: HttpMethod, path: string, response: JsonValue, status?: number) => CapturedHttpCall[];
|
|
12
|
+
interceptNetworkError: (method: HttpMethod, path: string) => void;
|
|
13
|
+
};
|
|
14
|
+
//#endregion
|
|
15
|
+
export { CapturedHttpCall, HttpMethod, JsonValue, createHttpInterceptor };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"msw-http.d.mts","names":[],"sources":["../../src/vitest/msw-http.ts"],"mappings":";KAIY,UAAA;AAAA,KACA,SAAA,sCAKR,SAAA;EAAA,CACG,GAAA,WAAc,SAAA;AAAA;AAAA,UAEJ,gBAAA;EACf,IAAA;EACA,MAAA,EAAQ,MAAA;AAAA;AAAA,iBAaM,qBAAA,CAAsB,OAAA;sBAE1B,UAAA,EAAU,IAAA,UACN,QAAA,EACF,SAAA,EAAS,MAAA,cAElB,gBAAA;kCAiBoC,UAAA,EAAU,IAAA;AAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { worker } from "./msw-browser.mjs";
|
|
2
|
+
import { HttpResponse, http } from "msw";
|
|
3
|
+
//#region src/vitest/msw-http.ts
|
|
4
|
+
async function parseBody(request) {
|
|
5
|
+
const clone = request.clone();
|
|
6
|
+
if ((clone.headers.get("content-type") ?? "").includes("multipart/form-data")) {
|
|
7
|
+
const formData = await clone.formData();
|
|
8
|
+
return Object.fromEntries(formData.entries());
|
|
9
|
+
}
|
|
10
|
+
return clone.json().catch(() => null);
|
|
11
|
+
}
|
|
12
|
+
function createHttpInterceptor(baseUrl) {
|
|
13
|
+
function intercept(method, path, response, status = 200) {
|
|
14
|
+
const calls = [];
|
|
15
|
+
worker.use(http[method](`${baseUrl}${path}`, async ({ request, params }) => {
|
|
16
|
+
calls.push({
|
|
17
|
+
body: await parseBody(request),
|
|
18
|
+
params
|
|
19
|
+
});
|
|
20
|
+
return HttpResponse.json(response, { status });
|
|
21
|
+
}));
|
|
22
|
+
return calls;
|
|
23
|
+
}
|
|
24
|
+
function interceptNetworkError(method, path) {
|
|
25
|
+
worker.use(http[method](`${baseUrl}${path}`, () => HttpResponse.error()));
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
intercept,
|
|
29
|
+
interceptNetworkError
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { createHttpInterceptor };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"msw-http.mjs","names":[],"sources":["../../src/vitest/msw-http.ts"],"sourcesContent":["import { HttpResponse, http } from \"msw\";\n\nimport { worker } from \"./msw-browser.js\";\n\nexport type HttpMethod = \"post\" | \"get\" | \"put\" | \"delete\" | \"patch\";\nexport type JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\n\nexport interface CapturedHttpCall {\n body: unknown;\n params: Record<string, string | readonly string[] | undefined>;\n}\n\nasync function parseBody(request: Request): Promise<unknown> {\n const clone = request.clone();\n const contentType = clone.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"multipart/form-data\")) {\n const formData = await clone.formData();\n return Object.fromEntries(formData.entries());\n }\n return clone.json().catch(() => null);\n}\n\nexport function createHttpInterceptor(baseUrl: string) {\n function intercept(\n method: HttpMethod,\n path: string,\n response: JsonValue,\n status = 200\n ): CapturedHttpCall[] {\n const calls: CapturedHttpCall[] = [];\n\n worker.use(\n http[method](`${baseUrl}${path}`, async ({ request, params }) => {\n calls.push({\n body: await parseBody(request),\n params,\n });\n\n return HttpResponse.json(response, { status });\n })\n );\n\n return calls;\n }\n\n function interceptNetworkError(method: HttpMethod, path: string): void {\n worker.use(http[method](`${baseUrl}${path}`, () => HttpResponse.error()));\n }\n\n return {\n intercept,\n interceptNetworkError,\n };\n}\n"],"mappings":";;;AAkBA,eAAe,UAAU,SAAoC;CAC3D,MAAM,QAAQ,QAAQ,OAAO;AAE7B,MADoB,MAAM,QAAQ,IAAI,eAAe,IAAI,IACzC,SAAS,sBAAsB,EAAE;EAC/C,MAAM,WAAW,MAAM,MAAM,UAAU;AACvC,SAAO,OAAO,YAAY,SAAS,SAAS,CAAC;;AAE/C,QAAO,MAAM,MAAM,CAAC,YAAY,KAAK;;AAGvC,SAAgB,sBAAsB,SAAiB;CACrD,SAAS,UACP,QACA,MACA,UACA,SAAS,KACW;EACpB,MAAM,QAA4B,EAAE;AAEpC,SAAO,IACL,KAAK,QAAQ,GAAG,UAAU,QAAQ,OAAO,EAAE,SAAS,aAAa;AAC/D,SAAM,KAAK;IACT,MAAM,MAAM,UAAU,QAAQ;IAC9B;IACD,CAAC;AAEF,UAAO,aAAa,KAAK,UAAU,EAAE,QAAQ,CAAC;IAC9C,CACH;AAED,SAAO;;CAGT,SAAS,sBAAsB,QAAoB,MAAoB;AACrE,SAAO,IAAI,KAAK,QAAQ,GAAG,UAAU,cAAc,aAAa,OAAO,CAAC,CAAC;;AAG3E,QAAO;EACL;EACA;EACD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { TestUserConfig, UserWorkspaceConfig } from "vitest/config";
|
|
2
|
+
|
|
3
|
+
//#region src/vitest/presets/browser.d.ts
|
|
4
|
+
type BrowserConfig = NonNullable<TestUserConfig["browser"]>;
|
|
5
|
+
type BrowserInstance = NonNullable<BrowserConfig["instances"]>[number];
|
|
6
|
+
interface BrowserProjectOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Playwright browser instances to run against. Use `dualViewport()` for the
|
|
9
|
+
* standard Desktop + Mobile split keyed on the `src/**/mobile/**` glob
|
|
10
|
+
* convention.
|
|
11
|
+
*/
|
|
12
|
+
instances: BrowserInstance[];
|
|
13
|
+
testAlias?: string | false;
|
|
14
|
+
trace?: boolean;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Glob matching all tests under a `mobile/` directory. Used by `dualViewport`
|
|
19
|
+
* to split the Desktop / Mobile test runs from a single file tree.
|
|
20
|
+
*/
|
|
21
|
+
declare const MOBILE_TESTS = "src/**/mobile/*.{test,spec}.?(c|m)[jt]s?(x)";
|
|
22
|
+
/**
|
|
23
|
+
* Standard Desktop + Mobile viewport split for UI apps. Desktop runs every
|
|
24
|
+
* test except those under `src/**/mobile/**`; Mobile runs only those.
|
|
25
|
+
*/
|
|
26
|
+
declare function dualViewport(): BrowserInstance[];
|
|
27
|
+
declare function browserProject(opts: BrowserProjectOptions): UserWorkspaceConfig;
|
|
28
|
+
//#endregion
|
|
29
|
+
export { BrowserInstance, BrowserProjectOptions, MOBILE_TESTS, browserProject, dualViewport };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.mts","names":[],"sources":["../../../src/vitest/presets/browser.ts"],"mappings":";;;KAUK,aAAA,GAAgB,WAAA,CAAY,cAAA;AAAA,KACrB,eAAA,GAAkB,WAAA,CAAY,aAAA;AAAA,UAIzB,qBAAA;EALC;;;;AAClB;EAUE,SAAA,EAAW,eAAA;EACX,SAAA;EACA,KAAA;EAAA,CACC,GAAA;AAAA;;;;;cAOU,YAAA;;;;;iBAMG,YAAA,CAAA,GAAgB,eAAA;AAAA,iBAkBhB,cAAA,CACd,IAAA,EAAM,qBAAA,GACL,mBAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { DESKTOP, MOBILE } from "../../lib/viewports.mjs";
|
|
2
|
+
import base_default from "../base.mjs";
|
|
3
|
+
import { deepMerge } from "@interfere/helpers/deep-merge";
|
|
4
|
+
import { resolve } from "node:path";
|
|
5
|
+
import react from "@vitejs/plugin-react";
|
|
6
|
+
import { playwright } from "@vitest/browser-playwright";
|
|
7
|
+
//#region src/vitest/presets/browser.ts
|
|
8
|
+
const INSTANCE_BASELINE_EXCLUDE = ["test/e2e/**/*.{test,spec}.?(c|m)[jt]s?(x)"];
|
|
9
|
+
/**
|
|
10
|
+
* Glob matching all tests under a `mobile/` directory. Used by `dualViewport`
|
|
11
|
+
* to split the Desktop / Mobile test runs from a single file tree.
|
|
12
|
+
*/
|
|
13
|
+
const MOBILE_TESTS = "src/**/mobile/*.{test,spec}.?(c|m)[jt]s?(x)";
|
|
14
|
+
/**
|
|
15
|
+
* Standard Desktop + Mobile viewport split for UI apps. Desktop runs every
|
|
16
|
+
* test except those under `src/**/mobile/**`; Mobile runs only those.
|
|
17
|
+
*/
|
|
18
|
+
function dualViewport() {
|
|
19
|
+
return [{
|
|
20
|
+
browser: "chromium",
|
|
21
|
+
name: "Chrome - Desktop",
|
|
22
|
+
viewport: DESKTOP,
|
|
23
|
+
exclude: [...INSTANCE_BASELINE_EXCLUDE, MOBILE_TESTS]
|
|
24
|
+
}, {
|
|
25
|
+
browser: "chromium",
|
|
26
|
+
name: "Chrome - Mobile",
|
|
27
|
+
viewport: MOBILE,
|
|
28
|
+
exclude: INSTANCE_BASELINE_EXCLUDE,
|
|
29
|
+
include: [MOBILE_TESTS]
|
|
30
|
+
}];
|
|
31
|
+
}
|
|
32
|
+
function browserProject(opts) {
|
|
33
|
+
const { instances, trace, testAlias = "test/unit", ...rest } = opts;
|
|
34
|
+
return deepMerge({ server: {
|
|
35
|
+
port: 0,
|
|
36
|
+
strictPort: false
|
|
37
|
+
} }, base_default, {
|
|
38
|
+
test: {
|
|
39
|
+
name: "browser",
|
|
40
|
+
browser: {
|
|
41
|
+
enabled: true,
|
|
42
|
+
provider: playwright(),
|
|
43
|
+
screenshotFailures: false,
|
|
44
|
+
instances,
|
|
45
|
+
...trace && { trace: { mode: "retain-on-failure" } }
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
plugins: [...react()],
|
|
49
|
+
optimizeDeps: {
|
|
50
|
+
entries: ["src/**/*.{ts,tsx}", "test/unit/**/*.{ts,tsx}"],
|
|
51
|
+
exclude: ["fsevents"]
|
|
52
|
+
},
|
|
53
|
+
...testAlias !== false && { resolve: {
|
|
54
|
+
tsconfigPaths: true,
|
|
55
|
+
alias: { "@test": resolve(process.cwd(), testAlias) }
|
|
56
|
+
} }
|
|
57
|
+
}, rest);
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { MOBILE_TESTS, browserProject, dualViewport };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.mjs","names":["base"],"sources":["../../../src/vitest/presets/browser.ts"],"sourcesContent":["import { deepMerge } from \"@interfere/helpers/deep-merge\";\n\nimport { resolve } from \"node:path\";\nimport react from \"@vitejs/plugin-react\";\nimport { playwright } from \"@vitest/browser-playwright\";\nimport type { TestUserConfig, UserWorkspaceConfig } from \"vitest/config\";\n\nimport { DESKTOP, MOBILE } from \"../../lib/viewports.js\";\nimport base from \"../base.js\";\n\ntype BrowserConfig = NonNullable<TestUserConfig[\"browser\"]>;\nexport type BrowserInstance = NonNullable<BrowserConfig[\"instances\"]>[number];\n\nconst INSTANCE_BASELINE_EXCLUDE = [\"test/e2e/**/*.{test,spec}.?(c|m)[jt]s?(x)\"];\n\nexport interface BrowserProjectOptions {\n /**\n * Playwright browser instances to run against. Use `dualViewport()` for the\n * standard Desktop + Mobile split keyed on the `src/**/mobile/**` glob\n * convention.\n */\n instances: BrowserInstance[];\n testAlias?: string | false;\n trace?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Glob matching all tests under a `mobile/` directory. Used by `dualViewport`\n * to split the Desktop / Mobile test runs from a single file tree.\n */\nexport const MOBILE_TESTS = \"src/**/mobile/*.{test,spec}.?(c|m)[jt]s?(x)\";\n\n/**\n * Standard Desktop + Mobile viewport split for UI apps. Desktop runs every\n * test except those under `src/**/mobile/**`; Mobile runs only those.\n */\nexport function dualViewport(): BrowserInstance[] {\n return [\n {\n browser: \"chromium\",\n name: \"Chrome - Desktop\",\n viewport: DESKTOP,\n exclude: [...INSTANCE_BASELINE_EXCLUDE, MOBILE_TESTS],\n },\n {\n browser: \"chromium\",\n name: \"Chrome - Mobile\",\n viewport: MOBILE,\n exclude: INSTANCE_BASELINE_EXCLUDE,\n include: [MOBILE_TESTS],\n },\n ];\n}\n\nexport function browserProject(\n opts: BrowserProjectOptions\n): UserWorkspaceConfig {\n const { instances, trace, testAlias = \"test/unit\", ...rest } = opts;\n\n return deepMerge<UserWorkspaceConfig>(\n { server: { port: 0, strictPort: false } },\n base,\n {\n test: {\n name: \"browser\",\n browser: {\n enabled: true,\n provider: playwright(),\n screenshotFailures: false,\n instances,\n ...(trace && { trace: { mode: \"retain-on-failure\" as const } }),\n },\n },\n plugins: [...react()],\n optimizeDeps: {\n entries: [\"src/**/*.{ts,tsx}\", \"test/unit/**/*.{ts,tsx}\"],\n exclude: [\"fsevents\"],\n },\n ...(testAlias !== false && {\n resolve: {\n tsconfigPaths: true,\n alias: {\n \"@test\": resolve(process.cwd(), testAlias),\n },\n },\n }),\n },\n rest\n );\n}\n"],"mappings":";;;;;;;AAaA,MAAM,4BAA4B,CAAC,4CAA4C;;;;;AAkB/E,MAAa,eAAe;;;;;AAM5B,SAAgB,eAAkC;AAChD,QAAO,CACL;EACE,SAAS;EACT,MAAM;EACN,UAAU;EACV,SAAS,CAAC,GAAG,2BAA2B,aAAa;EACtD,EACD;EACE,SAAS;EACT,MAAM;EACN,UAAU;EACV,SAAS;EACT,SAAS,CAAC,aAAa;EACxB,CACF;;AAGH,SAAgB,eACd,MACqB;CACrB,MAAM,EAAE,WAAW,OAAO,YAAY,aAAa,GAAG,SAAS;AAE/D,QAAO,UACL,EAAE,QAAQ;EAAE,MAAM;EAAG,YAAY;EAAO,EAAE,EAC1CA,cACA;EACE,MAAM;GACJ,MAAM;GACN,SAAS;IACP,SAAS;IACT,UAAU,YAAY;IACtB,oBAAoB;IACpB;IACA,GAAI,SAAS,EAAE,OAAO,EAAE,MAAM,qBAA8B,EAAE;IAC/D;GACF;EACD,SAAS,CAAC,GAAG,OAAO,CAAC;EACrB,cAAc;GACZ,SAAS,CAAC,qBAAqB,0BAA0B;GACzD,SAAS,CAAC,WAAW;GACtB;EACD,GAAI,cAAc,SAAS,EACzB,SAAS;GACP,eAAe;GACf,OAAO,EACL,SAAS,QAAQ,QAAQ,KAAK,EAAE,UAAU,EAC3C;GACF,EACF;EACF,EACD,KACD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { UserWorkspaceConfig } from "vitest/config";
|
|
2
|
+
|
|
3
|
+
//#region src/vitest/presets/node.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Build a Vitest project config running against the Node environment.
|
|
6
|
+
* Spreads `opts` over a shared base; caller-provided fields win.
|
|
7
|
+
*
|
|
8
|
+
* `*.test.{tsx,jsx}` files are excluded by default — React test files can't
|
|
9
|
+
* import `vitest-browser-react` outside of Browser Mode, so they always
|
|
10
|
+
* belong in the `browserProject`. Opt a specific TSX test in by adding its
|
|
11
|
+
* path to the caller's `test.include`.
|
|
12
|
+
*/
|
|
13
|
+
declare function nodeProject(opts?: Partial<UserWorkspaceConfig>): UserWorkspaceConfig;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { nodeProject };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.mts","names":[],"sources":["../../../src/vitest/presets/node.ts"],"mappings":";;;;;AAeA;;;;;;;iBAAgB,WAAA,CACd,IAAA,GAAM,OAAA,CAAQ,mBAAA,IACb,mBAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import base_default from "../base.mjs";
|
|
2
|
+
import { deepMerge } from "@interfere/helpers/deep-merge";
|
|
3
|
+
//#region src/vitest/presets/node.ts
|
|
4
|
+
/**
|
|
5
|
+
* Build a Vitest project config running against the Node environment.
|
|
6
|
+
* Spreads `opts` over a shared base; caller-provided fields win.
|
|
7
|
+
*
|
|
8
|
+
* `*.test.{tsx,jsx}` files are excluded by default — React test files can't
|
|
9
|
+
* import `vitest-browser-react` outside of Browser Mode, so they always
|
|
10
|
+
* belong in the `browserProject`. Opt a specific TSX test in by adding its
|
|
11
|
+
* path to the caller's `test.include`.
|
|
12
|
+
*/
|
|
13
|
+
function nodeProject(opts = {}) {
|
|
14
|
+
return deepMerge(base_default, { test: {
|
|
15
|
+
name: "node",
|
|
16
|
+
environment: "node",
|
|
17
|
+
exclude: [
|
|
18
|
+
"**/*.{test,spec}.tsx",
|
|
19
|
+
"**/*.{test,spec}.jsx",
|
|
20
|
+
"**/*.{test,spec}.mtsx",
|
|
21
|
+
"**/*.{test,spec}.mjsx"
|
|
22
|
+
]
|
|
23
|
+
} }, opts);
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
export { nodeProject };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.mjs","names":["base"],"sources":["../../../src/vitest/presets/node.ts"],"sourcesContent":["import { deepMerge } from \"@interfere/helpers/deep-merge\";\n\nimport type { UserWorkspaceConfig } from \"vitest/config\";\n\nimport base from \"../base.js\";\n\n/**\n * Build a Vitest project config running against the Node environment.\n * Spreads `opts` over a shared base; caller-provided fields win.\n *\n * `*.test.{tsx,jsx}` files are excluded by default — React test files can't\n * import `vitest-browser-react` outside of Browser Mode, so they always\n * belong in the `browserProject`. Opt a specific TSX test in by adding its\n * path to the caller's `test.include`.\n */\nexport function nodeProject(\n opts: Partial<UserWorkspaceConfig> = {}\n): UserWorkspaceConfig {\n return deepMerge<UserWorkspaceConfig>(\n base,\n {\n test: {\n name: \"node\",\n environment: \"node\",\n exclude: [\n \"**/*.{test,spec}.tsx\",\n \"**/*.{test,spec}.jsx\",\n \"**/*.{test,spec}.mtsx\",\n \"**/*.{test,spec}.mjsx\",\n ],\n },\n },\n opts\n );\n}\n"],"mappings":";;;;;;;;;;;;AAeA,SAAgB,YACd,OAAqC,EAAE,EAClB;AACrB,QAAO,UACLA,cACA,EACE,MAAM;EACJ,MAAM;EACN,aAAa;EACb,SAAS;GACP;GACA;GACA;GACA;GACD;EACF,EACF,EACD,KACD"}
|