vitest 3.1.0-beta.1 → 3.1.0-beta.2
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/browser.js +4 -4
- package/dist/chunks/base.CylSMlTD.js +41 -0
- package/dist/chunks/benchmark.BKUatJGy.js +39 -0
- package/dist/chunks/cac.JtTXbKz0.js +1525 -0
- package/dist/chunks/{cli-api.BwkkJsRe.js → cli-api.BTtPTYMs.js} +4638 -5072
- package/dist/chunks/console.D6t261w0.js +173 -0
- package/dist/chunks/constants.BZZyIeIE.js +43 -0
- package/dist/chunks/coverage.0iPg4Wrz.js +33 -0
- package/dist/chunks/{coverage.gV8doR2Y.js → coverage.C2ohxaN0.js} +2216 -2479
- package/dist/chunks/creator.BEXek7yQ.js +640 -0
- package/dist/chunks/date.CDOsz-HY.js +53 -0
- package/dist/chunks/defaults.DmfNPoe5.js +114 -0
- package/dist/chunks/{env.D4Lgay0q.js → env.Dq0hM4Xv.js} +1 -1
- package/dist/chunks/execute.DZKwfrTs.js +791 -0
- package/dist/chunks/git.DXfdBEfR.js +74 -0
- package/dist/chunks/{globals.BEpDe-k3.js → globals.DCbUWjip.js} +10 -10
- package/dist/chunks/{index.D7Ny8f_s.js → index.BDobFbcz.js} +6 -7
- package/dist/chunks/index.DFXFpH3w.js +607 -0
- package/dist/chunks/index.VfYQ6MXY.js +104 -0
- package/dist/chunks/index.ZIOEXBQB.js +2382 -0
- package/dist/chunks/inspector.DbDkSkFn.js +54 -0
- package/dist/chunks/node.IqGoMrm4.js +15 -0
- package/dist/chunks/{reporters.d.r7poTZjA.d.ts → reporters.d.5g6jXhoW.d.ts} +14 -3
- package/dist/chunks/rpc.DGgL5dw7.js +92 -0
- package/dist/chunks/run-once.I7PpBOk1.js +47 -0
- package/dist/chunks/runBaseTests.CqmKSG99.js +134 -0
- package/dist/chunks/setup-common.DEGDGBiA.js +88 -0
- package/dist/chunks/{typechecker.BlF3eHsb.js → typechecker.C2IpOhid.js} +620 -622
- package/dist/chunks/utils.BfxieIyZ.js +66 -0
- package/dist/chunks/utils.CtocqOoE.js +72 -0
- package/dist/chunks/utils.OLmtDstN.js +194 -0
- package/dist/chunks/{vi.nSCvwQ7l.js → vi.B-PuvDzu.js} +878 -1019
- package/dist/chunks/vite.d.Dh1jE-_V.d.ts +23 -0
- package/dist/chunks/vm.BW5voG-u.js +789 -0
- package/dist/cli.js +2 -2
- package/dist/config.cjs +97 -103
- package/dist/config.d.ts +3 -3
- package/dist/config.js +6 -6
- package/dist/coverage.d.ts +1 -1
- package/dist/coverage.js +6 -6
- package/dist/environments.js +1 -1
- package/dist/execute.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +6 -6
- package/dist/node.d.ts +3 -3
- package/dist/node.js +36 -45
- package/dist/path.js +1 -4
- package/dist/reporters.d.ts +1 -1
- package/dist/reporters.js +4 -4
- package/dist/runners.js +231 -267
- package/dist/snapshot.js +2 -2
- package/dist/suite.js +2 -2
- package/dist/worker.js +98 -114
- package/dist/workers/forks.js +22 -22
- package/dist/workers/runVmTests.js +61 -66
- package/dist/workers/threads.js +13 -13
- package/dist/workers/vmForks.js +24 -24
- package/dist/workers/vmThreads.js +15 -15
- package/dist/workers.js +10 -10
- package/package.json +11 -11
- package/dist/chunks/base.DV59CbtV.js +0 -45
- package/dist/chunks/benchmark.DL72EVN-.js +0 -40
- package/dist/chunks/cac.BjmXy7OV.js +0 -1664
- package/dist/chunks/console.CN7AiMGV.js +0 -179
- package/dist/chunks/constants.DTYd6dNH.js +0 -46
- package/dist/chunks/coverage.A3sS5-Wm.js +0 -40
- package/dist/chunks/creator.BsBnpTzI.js +0 -670
- package/dist/chunks/date.W2xKR2qe.js +0 -53
- package/dist/chunks/defaults.C2Ndd9wx.js +0 -119
- package/dist/chunks/execute.eDH0aFFd.js +0 -839
- package/dist/chunks/git.B5SDxu-n.js +0 -69
- package/dist/chunks/index.DOyx6FYJ.js +0 -2551
- package/dist/chunks/index.K90BXFOx.js +0 -658
- package/dist/chunks/index.uXkkC4xl.js +0 -111
- package/dist/chunks/inspector.DKLceBVD.js +0 -54
- package/dist/chunks/node.AKq966Jp.js +0 -15
- package/dist/chunks/rpc.TVf73xOu.js +0 -102
- package/dist/chunks/run-once.2ogXb3JV.js +0 -28
- package/dist/chunks/runBaseTests.BVrL_ow3.js +0 -142
- package/dist/chunks/setup-common.CPvtqi8q.js +0 -96
- package/dist/chunks/utils.C8RiOc4B.js +0 -77
- package/dist/chunks/utils.Cn0zI1t3.js +0 -68
- package/dist/chunks/utils.bLM2atbD.js +0 -198
- package/dist/chunks/vite.d.Fvq-NZoa.d.ts +0 -11
- package/dist/chunks/vm.jEFQDlX_.js +0 -852
|
@@ -1,670 +0,0 @@
|
|
|
1
|
-
import { existsSync, writeFileSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
-
import { resolve, dirname, relative } from 'node:path';
|
|
4
|
-
import { detectPackageManager, installPackage } from './index.Bw6JxgX8.js';
|
|
5
|
-
import { p as prompt, f as findUp } from './index.DBIGubLC.js';
|
|
6
|
-
import { x } from 'tinyexec';
|
|
7
|
-
import c from 'tinyrainbow';
|
|
8
|
-
import { c as configFiles } from './constants.DTYd6dNH.js';
|
|
9
|
-
import 'node:process';
|
|
10
|
-
import 'node:url';
|
|
11
|
-
import './_commonjsHelpers.BFTU3MAI.js';
|
|
12
|
-
import 'readline';
|
|
13
|
-
import 'events';
|
|
14
|
-
|
|
15
|
-
const jsxExample = {
|
|
16
|
-
name: "HelloWorld.jsx",
|
|
17
|
-
js: `
|
|
18
|
-
export default function HelloWorld({ name }) {
|
|
19
|
-
return (
|
|
20
|
-
<div>
|
|
21
|
-
<h1>Hello {name}!</h1>
|
|
22
|
-
</div>
|
|
23
|
-
)
|
|
24
|
-
}
|
|
25
|
-
`,
|
|
26
|
-
ts: `
|
|
27
|
-
export default function HelloWorld({ name }: { name: string }) {
|
|
28
|
-
return (
|
|
29
|
-
<div>
|
|
30
|
-
<h1>Hello {name}!</h1>
|
|
31
|
-
</div>
|
|
32
|
-
)
|
|
33
|
-
}
|
|
34
|
-
`,
|
|
35
|
-
test: `
|
|
36
|
-
import { expect, test } from 'vitest'
|
|
37
|
-
import { render } from '@testing-library/jsx'
|
|
38
|
-
import HelloWorld from './HelloWorld.jsx'
|
|
39
|
-
|
|
40
|
-
test('renders name', async () => {
|
|
41
|
-
const { getByText } = render(<HelloWorld name="Vitest" />)
|
|
42
|
-
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
|
43
|
-
})
|
|
44
|
-
`
|
|
45
|
-
};
|
|
46
|
-
const vueExample = {
|
|
47
|
-
name: "HelloWorld.vue",
|
|
48
|
-
js: `
|
|
49
|
-
<script setup>
|
|
50
|
-
defineProps({
|
|
51
|
-
name: String
|
|
52
|
-
})
|
|
53
|
-
<\/script>
|
|
54
|
-
|
|
55
|
-
<template>
|
|
56
|
-
<div>
|
|
57
|
-
<h1>Hello {{ name }}!</h1>
|
|
58
|
-
</div>
|
|
59
|
-
</template>
|
|
60
|
-
`,
|
|
61
|
-
ts: `
|
|
62
|
-
<script setup lang="ts">
|
|
63
|
-
defineProps<{
|
|
64
|
-
name: string
|
|
65
|
-
}>()
|
|
66
|
-
<\/script>
|
|
67
|
-
|
|
68
|
-
<template>
|
|
69
|
-
<div>
|
|
70
|
-
<h1>Hello {{ name }}!</h1>
|
|
71
|
-
</div>
|
|
72
|
-
</template>
|
|
73
|
-
`,
|
|
74
|
-
test: `
|
|
75
|
-
import { expect, test } from 'vitest'
|
|
76
|
-
import { render } from 'vitest-browser-vue'
|
|
77
|
-
import HelloWorld from './HelloWorld.vue'
|
|
78
|
-
|
|
79
|
-
test('renders name', async () => {
|
|
80
|
-
const { getByText } = render(HelloWorld, {
|
|
81
|
-
props: { name: 'Vitest' },
|
|
82
|
-
})
|
|
83
|
-
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
|
84
|
-
})
|
|
85
|
-
`
|
|
86
|
-
};
|
|
87
|
-
const svelteExample = {
|
|
88
|
-
name: "HelloWorld.svelte",
|
|
89
|
-
js: `
|
|
90
|
-
<script>
|
|
91
|
-
export let name
|
|
92
|
-
<\/script>
|
|
93
|
-
|
|
94
|
-
<h1>Hello {name}!</h1>
|
|
95
|
-
`,
|
|
96
|
-
ts: `
|
|
97
|
-
<script lang="ts">
|
|
98
|
-
export let name: string
|
|
99
|
-
<\/script>
|
|
100
|
-
|
|
101
|
-
<h1>Hello {name}!</h1>
|
|
102
|
-
`,
|
|
103
|
-
test: `
|
|
104
|
-
import { expect, test } from 'vitest'
|
|
105
|
-
import { render } from 'vitest-browser-svelte'
|
|
106
|
-
import HelloWorld from './HelloWorld.svelte'
|
|
107
|
-
|
|
108
|
-
test('renders name', async () => {
|
|
109
|
-
const { getByText } = render(HelloWorld, { name: 'Vitest' })
|
|
110
|
-
await expect.element(getByText('Hello Vitest!')).toBeInTheDocument()
|
|
111
|
-
})
|
|
112
|
-
`
|
|
113
|
-
};
|
|
114
|
-
const markoExample = {
|
|
115
|
-
name: "HelloWorld.marko",
|
|
116
|
-
js: `
|
|
117
|
-
class {
|
|
118
|
-
onCreate() {
|
|
119
|
-
this.state = { name: null }
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
<h1>Hello \${state.name}!</h1>
|
|
124
|
-
`,
|
|
125
|
-
ts: `
|
|
126
|
-
export interface Input {
|
|
127
|
-
name: string
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
<h1>Hello \${input.name}!</h1>
|
|
131
|
-
`,
|
|
132
|
-
test: `
|
|
133
|
-
import { expect, test } from 'vitest'
|
|
134
|
-
import { render } from '@marko/testing-library'
|
|
135
|
-
import HelloWorld from './HelloWorld.svelte'
|
|
136
|
-
|
|
137
|
-
test('renders name', async () => {
|
|
138
|
-
const { getByText } = await render(HelloWorld, { name: 'Vitest' })
|
|
139
|
-
const element = getByText('Hello Vitest!')
|
|
140
|
-
expect(element).toBeInTheDocument()
|
|
141
|
-
})
|
|
142
|
-
`
|
|
143
|
-
};
|
|
144
|
-
const vanillaExample = {
|
|
145
|
-
name: "HelloWorld.js",
|
|
146
|
-
js: `
|
|
147
|
-
export default function HelloWorld({ name }) {
|
|
148
|
-
const parent = document.createElement('div')
|
|
149
|
-
|
|
150
|
-
const h1 = document.createElement('h1')
|
|
151
|
-
h1.textContent = 'Hello ' + name + '!'
|
|
152
|
-
parent.appendChild(h1)
|
|
153
|
-
|
|
154
|
-
return parent
|
|
155
|
-
}
|
|
156
|
-
`,
|
|
157
|
-
ts: `
|
|
158
|
-
export default function HelloWorld({ name }: { name: string }): HTMLDivElement {
|
|
159
|
-
const parent = document.createElement('div')
|
|
160
|
-
|
|
161
|
-
const h1 = document.createElement('h1')
|
|
162
|
-
h1.textContent = 'Hello ' + name + '!'
|
|
163
|
-
parent.appendChild(h1)
|
|
164
|
-
|
|
165
|
-
return parent
|
|
166
|
-
}
|
|
167
|
-
`,
|
|
168
|
-
test: `
|
|
169
|
-
import { expect, test } from 'vitest'
|
|
170
|
-
import { getByText } from '@testing-library/dom'
|
|
171
|
-
import HelloWorld from './HelloWorld.js'
|
|
172
|
-
|
|
173
|
-
test('renders name', () => {
|
|
174
|
-
const parent = HelloWorld({ name: 'Vitest' })
|
|
175
|
-
document.body.appendChild(parent)
|
|
176
|
-
|
|
177
|
-
const element = getByText(parent, 'Hello Vitest!')
|
|
178
|
-
expect(element).toBeInTheDocument()
|
|
179
|
-
})
|
|
180
|
-
`
|
|
181
|
-
};
|
|
182
|
-
function getExampleTest(framework) {
|
|
183
|
-
switch (framework) {
|
|
184
|
-
case "solid":
|
|
185
|
-
case "preact":
|
|
186
|
-
return {
|
|
187
|
-
...jsxExample,
|
|
188
|
-
test: jsxExample.test.replace("@testing-library/jsx", `@testing-library/${framework}`)
|
|
189
|
-
};
|
|
190
|
-
case "react":
|
|
191
|
-
return {
|
|
192
|
-
...jsxExample,
|
|
193
|
-
test: jsxExample.test.replace("@testing-library/jsx", "vitest-browser-react")
|
|
194
|
-
};
|
|
195
|
-
case "vue":
|
|
196
|
-
return vueExample;
|
|
197
|
-
case "svelte":
|
|
198
|
-
return svelteExample;
|
|
199
|
-
case "marko":
|
|
200
|
-
return markoExample;
|
|
201
|
-
default:
|
|
202
|
-
return vanillaExample;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
async function generateExampleFiles(framework, lang) {
|
|
206
|
-
const example = getExampleTest(framework);
|
|
207
|
-
let fileName = example.name;
|
|
208
|
-
const folder = resolve(process.cwd(), "vitest-example");
|
|
209
|
-
const fileContent = example[lang];
|
|
210
|
-
if (!existsSync(folder)) {
|
|
211
|
-
await mkdir(folder, { recursive: true });
|
|
212
|
-
}
|
|
213
|
-
const isJSX = fileName.endsWith(".jsx");
|
|
214
|
-
if (isJSX && lang === "ts") {
|
|
215
|
-
fileName = fileName.replace(".jsx", ".tsx");
|
|
216
|
-
} else if (fileName.endsWith(".js") && lang === "ts") {
|
|
217
|
-
fileName = fileName.replace(".js", ".ts");
|
|
218
|
-
}
|
|
219
|
-
const filePath = resolve(folder, fileName);
|
|
220
|
-
const testPath = resolve(folder, `HelloWorld.test.${isJSX ? `${lang}x` : lang}`);
|
|
221
|
-
writeFileSync(filePath, fileContent.trimStart(), "utf-8");
|
|
222
|
-
writeFileSync(testPath, example.test.trimStart(), "utf-8");
|
|
223
|
-
return testPath;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
const log = console.log;
|
|
227
|
-
function getProviderOptions() {
|
|
228
|
-
const providers = {
|
|
229
|
-
playwright: "Playwright relies on Chrome DevTools protocol. Read more: https://playwright.dev",
|
|
230
|
-
webdriverio: "WebdriverIO uses WebDriver protocol. Read more: https://webdriver.io",
|
|
231
|
-
preview: "Preview is useful to quickly run your tests in the browser, but not suitable for CI."
|
|
232
|
-
};
|
|
233
|
-
return Object.entries(providers).map(([provider, description]) => {
|
|
234
|
-
return {
|
|
235
|
-
title: provider,
|
|
236
|
-
description,
|
|
237
|
-
value: provider
|
|
238
|
-
};
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
function getBrowserNames(provider) {
|
|
242
|
-
switch (provider) {
|
|
243
|
-
case "webdriverio":
|
|
244
|
-
return ["chrome", "firefox", "edge", "safari"];
|
|
245
|
-
case "playwright":
|
|
246
|
-
return ["chromium", "firefox", "webkit"];
|
|
247
|
-
case "preview":
|
|
248
|
-
return ["chrome", "firefox", "safari"];
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
function getProviderPackageNames(provider) {
|
|
252
|
-
switch (provider) {
|
|
253
|
-
case "webdriverio":
|
|
254
|
-
return {
|
|
255
|
-
types: "@vitest/browser/providers/webdriverio",
|
|
256
|
-
pkg: "webdriverio"
|
|
257
|
-
};
|
|
258
|
-
case "playwright":
|
|
259
|
-
return {
|
|
260
|
-
types: "@vitest/browser/providers/playwright",
|
|
261
|
-
pkg: "playwright"
|
|
262
|
-
};
|
|
263
|
-
case "preview":
|
|
264
|
-
return {
|
|
265
|
-
types: "@vitest/browser/matchers",
|
|
266
|
-
pkg: null
|
|
267
|
-
};
|
|
268
|
-
}
|
|
269
|
-
throw new Error(`Unsupported provider: ${provider}`);
|
|
270
|
-
}
|
|
271
|
-
function getFramework() {
|
|
272
|
-
return [
|
|
273
|
-
{
|
|
274
|
-
title: "vanilla",
|
|
275
|
-
value: "vanilla",
|
|
276
|
-
description: "No framework, just plain JavaScript or TypeScript."
|
|
277
|
-
},
|
|
278
|
-
{
|
|
279
|
-
title: "vue",
|
|
280
|
-
value: "vue",
|
|
281
|
-
description: '"The Progressive JavaScript Framework"'
|
|
282
|
-
},
|
|
283
|
-
{
|
|
284
|
-
title: "svelte",
|
|
285
|
-
value: "svelte",
|
|
286
|
-
description: '"Svelte: cybernetically enhanced web apps"'
|
|
287
|
-
},
|
|
288
|
-
{
|
|
289
|
-
title: "react",
|
|
290
|
-
value: "react",
|
|
291
|
-
description: '"The library for web and native user interfaces"'
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
title: "preact",
|
|
295
|
-
value: "preact",
|
|
296
|
-
description: '"Fast 3kB alternative to React with the same modern API"'
|
|
297
|
-
},
|
|
298
|
-
{
|
|
299
|
-
title: "solid",
|
|
300
|
-
value: "solid",
|
|
301
|
-
description: '"Simple and performant reactivity for building user interfaces"'
|
|
302
|
-
},
|
|
303
|
-
{
|
|
304
|
-
title: "marko",
|
|
305
|
-
value: "marko",
|
|
306
|
-
description: '"A declarative, HTML-based language that makes building web apps fun"'
|
|
307
|
-
}
|
|
308
|
-
];
|
|
309
|
-
}
|
|
310
|
-
function getFrameworkTestPackage(framework) {
|
|
311
|
-
switch (framework) {
|
|
312
|
-
case "vanilla":
|
|
313
|
-
return null;
|
|
314
|
-
case "vue":
|
|
315
|
-
return "vitest-browser-vue";
|
|
316
|
-
case "svelte":
|
|
317
|
-
return "vitest-browser-svelte";
|
|
318
|
-
case "react":
|
|
319
|
-
return "vitest-browser-react";
|
|
320
|
-
case "preact":
|
|
321
|
-
return "@testing-library/preact";
|
|
322
|
-
case "solid":
|
|
323
|
-
return "@solidjs/testing-library";
|
|
324
|
-
case "marko":
|
|
325
|
-
return "@marko/testing-library";
|
|
326
|
-
}
|
|
327
|
-
throw new Error(`Unsupported framework: ${framework}`);
|
|
328
|
-
}
|
|
329
|
-
function getFrameworkPluginPackage(framework) {
|
|
330
|
-
switch (framework) {
|
|
331
|
-
case "vue":
|
|
332
|
-
return "@vitejs/plugin-vue";
|
|
333
|
-
case "svelte":
|
|
334
|
-
return "@sveltejs/vite-plugin-svelte";
|
|
335
|
-
case "react":
|
|
336
|
-
return "@vitejs/plugin-react";
|
|
337
|
-
case "preact":
|
|
338
|
-
return "@preact/preset-vite";
|
|
339
|
-
case "solid":
|
|
340
|
-
return "vite-plugin-solid";
|
|
341
|
-
case "marko":
|
|
342
|
-
return "@marko/vite";
|
|
343
|
-
}
|
|
344
|
-
return null;
|
|
345
|
-
}
|
|
346
|
-
async function updateTsConfig(type) {
|
|
347
|
-
if (type == null) {
|
|
348
|
-
return;
|
|
349
|
-
}
|
|
350
|
-
const msg = `Add "${c.bold(type)}" to your tsconfig.json "${c.bold("compilerOptions.types")}" field to have better intellisense support.`;
|
|
351
|
-
log();
|
|
352
|
-
log(c.yellow("\u25FC"), c.yellow(msg));
|
|
353
|
-
}
|
|
354
|
-
function getLanguageOptions() {
|
|
355
|
-
return [
|
|
356
|
-
{
|
|
357
|
-
title: "TypeScript",
|
|
358
|
-
description: "Use TypeScript.",
|
|
359
|
-
value: "ts"
|
|
360
|
-
},
|
|
361
|
-
{
|
|
362
|
-
title: "JavaScript",
|
|
363
|
-
description: "Use plain JavaScript.",
|
|
364
|
-
value: "js"
|
|
365
|
-
}
|
|
366
|
-
];
|
|
367
|
-
}
|
|
368
|
-
async function installPackages(pkgManager, packages) {
|
|
369
|
-
if (!packages.length) {
|
|
370
|
-
log(c.green("\u2714"), c.bold("All packages are already installed."));
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
log(c.cyan("\u25FC"), c.bold("Installing packages..."));
|
|
374
|
-
log(c.cyan("\u25FC"), packages.join(", "));
|
|
375
|
-
log();
|
|
376
|
-
await installPackage(packages, { dev: true, packageManager: pkgManager ?? void 0 });
|
|
377
|
-
}
|
|
378
|
-
function readPkgJson(path) {
|
|
379
|
-
if (!existsSync(path)) {
|
|
380
|
-
return null;
|
|
381
|
-
}
|
|
382
|
-
const content = readFileSync(path, "utf-8");
|
|
383
|
-
return JSON.parse(content);
|
|
384
|
-
}
|
|
385
|
-
function getPossibleDefaults(dependencies) {
|
|
386
|
-
const provider = getPossibleProvider(dependencies);
|
|
387
|
-
const framework = getPossibleFramework(dependencies);
|
|
388
|
-
return {
|
|
389
|
-
lang: "ts",
|
|
390
|
-
provider,
|
|
391
|
-
framework
|
|
392
|
-
};
|
|
393
|
-
}
|
|
394
|
-
function getPossibleFramework(dependencies) {
|
|
395
|
-
if (dependencies.vue || dependencies["vue-tsc"] || dependencies["@vue/reactivity"]) {
|
|
396
|
-
return "vue";
|
|
397
|
-
}
|
|
398
|
-
if (dependencies.react || dependencies["react-dom"]) {
|
|
399
|
-
return "react";
|
|
400
|
-
}
|
|
401
|
-
if (dependencies.svelte || dependencies["@sveltejs/kit"]) {
|
|
402
|
-
return "svelte";
|
|
403
|
-
}
|
|
404
|
-
if (dependencies.preact) {
|
|
405
|
-
return "preact";
|
|
406
|
-
}
|
|
407
|
-
if (dependencies["solid-js"] || dependencies["@solidjs/start"]) {
|
|
408
|
-
return "solid";
|
|
409
|
-
}
|
|
410
|
-
if (dependencies.marko) {
|
|
411
|
-
return "marko";
|
|
412
|
-
}
|
|
413
|
-
return "vanilla";
|
|
414
|
-
}
|
|
415
|
-
function getPossibleProvider(dependencies) {
|
|
416
|
-
if (dependencies.webdriverio || dependencies["@wdio/cli"] || dependencies["@wdio/config"]) {
|
|
417
|
-
return "webdriverio";
|
|
418
|
-
}
|
|
419
|
-
return "playwright";
|
|
420
|
-
}
|
|
421
|
-
function getProviderDocsLink(provider) {
|
|
422
|
-
switch (provider) {
|
|
423
|
-
case "playwright":
|
|
424
|
-
return "https://vitest.dev/guide/browser/playwright";
|
|
425
|
-
case "webdriverio":
|
|
426
|
-
return "https://vitest.dev/guide/browser/webdriverio";
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
function sort(choices, value) {
|
|
430
|
-
const index = choices.findIndex((i) => i.value === value);
|
|
431
|
-
if (index === -1) {
|
|
432
|
-
return choices;
|
|
433
|
-
}
|
|
434
|
-
const item = choices.splice(index, 1)[0];
|
|
435
|
-
return [item, ...choices];
|
|
436
|
-
}
|
|
437
|
-
function fail() {
|
|
438
|
-
process.exitCode = 1;
|
|
439
|
-
}
|
|
440
|
-
async function generateWorkspaceFile(options) {
|
|
441
|
-
const relativeRoot = relative(dirname(options.configPath), options.rootConfig);
|
|
442
|
-
const workspaceContent = [
|
|
443
|
-
`import { defineWorkspace } from 'vitest/config'`,
|
|
444
|
-
"",
|
|
445
|
-
"export default defineWorkspace([",
|
|
446
|
-
" // If you want to keep running your existing tests in Node.js, uncomment the next line.",
|
|
447
|
-
` // '${relativeRoot}',`,
|
|
448
|
-
` {`,
|
|
449
|
-
` extends: '${relativeRoot}',`,
|
|
450
|
-
` test: {`,
|
|
451
|
-
` browser: {`,
|
|
452
|
-
` enabled: true,`,
|
|
453
|
-
` provider: '${options.provider}',`,
|
|
454
|
-
options.provider !== "preview" && ` // ${getProviderDocsLink(options.provider)}`,
|
|
455
|
-
` instances: [`,
|
|
456
|
-
...options.browsers.map((browser) => ` { browser: '${browser}' },`),
|
|
457
|
-
` ],`,
|
|
458
|
-
` },`,
|
|
459
|
-
` },`,
|
|
460
|
-
` },`,
|
|
461
|
-
`])`,
|
|
462
|
-
""
|
|
463
|
-
].filter((c2) => typeof c2 === "string").join("\n");
|
|
464
|
-
await writeFile(options.configPath, workspaceContent);
|
|
465
|
-
}
|
|
466
|
-
async function generateFrameworkConfigFile(options) {
|
|
467
|
-
const frameworkImport = options.framework === "svelte" ? `import { svelte } from '${options.frameworkPlugin}'` : `import ${options.framework} from '${options.frameworkPlugin}'`;
|
|
468
|
-
const configContent = [
|
|
469
|
-
`import { defineConfig } from 'vitest/config'`,
|
|
470
|
-
options.frameworkPlugin ? frameworkImport : null,
|
|
471
|
-
``,
|
|
472
|
-
"export default defineConfig({",
|
|
473
|
-
options.frameworkPlugin ? ` plugins: [${options.framework}()],` : null,
|
|
474
|
-
` test: {`,
|
|
475
|
-
` browser: {`,
|
|
476
|
-
` enabled: true,`,
|
|
477
|
-
` provider: '${options.provider}',`,
|
|
478
|
-
options.provider !== "preview" && ` // ${getProviderDocsLink(options.provider)}`,
|
|
479
|
-
` instances: [`,
|
|
480
|
-
...options.browsers.map((browser) => ` { browser: '${browser}' },`),
|
|
481
|
-
` ],`,
|
|
482
|
-
` },`,
|
|
483
|
-
` },`,
|
|
484
|
-
`})`,
|
|
485
|
-
""
|
|
486
|
-
].filter((t) => typeof t === "string").join("\n");
|
|
487
|
-
await writeFile(options.configPath, configContent);
|
|
488
|
-
}
|
|
489
|
-
async function updatePkgJsonScripts(pkgJsonPath, vitestScript) {
|
|
490
|
-
if (!existsSync(pkgJsonPath)) {
|
|
491
|
-
const pkg = {
|
|
492
|
-
scripts: {
|
|
493
|
-
"test:browser": vitestScript
|
|
494
|
-
}
|
|
495
|
-
};
|
|
496
|
-
await writeFile(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}
|
|
497
|
-
`, "utf-8");
|
|
498
|
-
} else {
|
|
499
|
-
const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
|
|
500
|
-
pkg.scripts = pkg.scripts || {};
|
|
501
|
-
pkg.scripts["test:browser"] = vitestScript;
|
|
502
|
-
await writeFile(pkgJsonPath, `${JSON.stringify(pkg, null, 2)}
|
|
503
|
-
`, "utf-8");
|
|
504
|
-
}
|
|
505
|
-
log(c.green("\u2714"), 'Added "test:browser" script to your package.json.');
|
|
506
|
-
}
|
|
507
|
-
function getRunScript(pkgManager) {
|
|
508
|
-
switch (pkgManager) {
|
|
509
|
-
case "yarn@berry":
|
|
510
|
-
case "yarn":
|
|
511
|
-
return "yarn test:browser";
|
|
512
|
-
case "pnpm@6":
|
|
513
|
-
case "pnpm":
|
|
514
|
-
return "pnpm test:browser";
|
|
515
|
-
case "bun":
|
|
516
|
-
return "bun test:browser";
|
|
517
|
-
default:
|
|
518
|
-
return "npm run test:browser";
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
function getPlaywrightRunArgs(pkgManager) {
|
|
522
|
-
switch (pkgManager) {
|
|
523
|
-
case "yarn@berry":
|
|
524
|
-
case "yarn":
|
|
525
|
-
return ["yarn", "exec"];
|
|
526
|
-
case "pnpm@6":
|
|
527
|
-
case "pnpm":
|
|
528
|
-
return ["pnpx"];
|
|
529
|
-
case "bun":
|
|
530
|
-
return ["bunx"];
|
|
531
|
-
default:
|
|
532
|
-
return ["npx"];
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
async function create() {
|
|
536
|
-
log(c.cyan("\u25FC"), "This utility will help you set up a browser testing environment.\n");
|
|
537
|
-
const pkgJsonPath = resolve(process.cwd(), "package.json");
|
|
538
|
-
const pkg = readPkgJson(pkgJsonPath) || {};
|
|
539
|
-
const dependencies = {
|
|
540
|
-
...pkg.dependencies,
|
|
541
|
-
...pkg.devDependencies
|
|
542
|
-
};
|
|
543
|
-
const defaults = getPossibleDefaults(dependencies);
|
|
544
|
-
const { lang } = await prompt({
|
|
545
|
-
type: "select",
|
|
546
|
-
name: "lang",
|
|
547
|
-
message: "Choose a language for your tests",
|
|
548
|
-
choices: sort(getLanguageOptions(), defaults?.lang)
|
|
549
|
-
});
|
|
550
|
-
if (!lang) {
|
|
551
|
-
return fail();
|
|
552
|
-
}
|
|
553
|
-
const { provider } = await prompt({
|
|
554
|
-
type: "select",
|
|
555
|
-
name: "provider",
|
|
556
|
-
message: "Choose a browser provider. Vitest will use its API to control the testing environment",
|
|
557
|
-
choices: sort(getProviderOptions(), defaults?.provider)
|
|
558
|
-
});
|
|
559
|
-
if (!provider) {
|
|
560
|
-
return fail();
|
|
561
|
-
}
|
|
562
|
-
const { browsers } = await prompt({
|
|
563
|
-
type: "multiselect",
|
|
564
|
-
name: "browsers",
|
|
565
|
-
message: "Choose a browser",
|
|
566
|
-
choices: getBrowserNames(provider).map((browser) => ({
|
|
567
|
-
title: browser,
|
|
568
|
-
value: browser
|
|
569
|
-
}))
|
|
570
|
-
});
|
|
571
|
-
if (!provider) {
|
|
572
|
-
return fail();
|
|
573
|
-
}
|
|
574
|
-
const { framework } = await prompt({
|
|
575
|
-
type: "select",
|
|
576
|
-
name: "framework",
|
|
577
|
-
message: "Choose your framework",
|
|
578
|
-
choices: sort(getFramework(), defaults?.framework)
|
|
579
|
-
});
|
|
580
|
-
if (!framework) {
|
|
581
|
-
return fail();
|
|
582
|
-
}
|
|
583
|
-
let installPlaywright = false;
|
|
584
|
-
if (provider === "playwright") {
|
|
585
|
-
({ installPlaywright } = await prompt({
|
|
586
|
-
type: "confirm",
|
|
587
|
-
name: "installPlaywright",
|
|
588
|
-
message: `Install Playwright browsers (can be done manually via 'pnpm exec playwright install')?`
|
|
589
|
-
}));
|
|
590
|
-
}
|
|
591
|
-
if (installPlaywright == null) {
|
|
592
|
-
return fail();
|
|
593
|
-
}
|
|
594
|
-
const dependenciesToInstall = [
|
|
595
|
-
"@vitest/browser"
|
|
596
|
-
];
|
|
597
|
-
const frameworkPackage = getFrameworkTestPackage(framework);
|
|
598
|
-
if (frameworkPackage) {
|
|
599
|
-
dependenciesToInstall.push(frameworkPackage);
|
|
600
|
-
}
|
|
601
|
-
const providerPkg = getProviderPackageNames(provider);
|
|
602
|
-
if (providerPkg.pkg) {
|
|
603
|
-
dependenciesToInstall.push(providerPkg.pkg);
|
|
604
|
-
}
|
|
605
|
-
const frameworkPlugin = getFrameworkPluginPackage(framework);
|
|
606
|
-
if (frameworkPlugin) {
|
|
607
|
-
dependenciesToInstall.push(frameworkPlugin);
|
|
608
|
-
}
|
|
609
|
-
const pkgManager = await detectPackageManager();
|
|
610
|
-
log();
|
|
611
|
-
await installPackages(
|
|
612
|
-
pkgManager,
|
|
613
|
-
dependenciesToInstall.filter((pkg2) => !dependencies[pkg2])
|
|
614
|
-
);
|
|
615
|
-
const rootConfig = await findUp(configFiles, {
|
|
616
|
-
cwd: process.cwd()
|
|
617
|
-
});
|
|
618
|
-
let scriptCommand = "vitest";
|
|
619
|
-
log();
|
|
620
|
-
if (rootConfig) {
|
|
621
|
-
let browserWorkspaceFile = resolve(dirname(rootConfig), `vitest.workspace.${lang}`);
|
|
622
|
-
if (existsSync(browserWorkspaceFile)) {
|
|
623
|
-
log(c.yellow("\u26A0"), c.yellow("A workspace file already exists. Creating a new one for the browser tests - you can merge them manually if needed."));
|
|
624
|
-
browserWorkspaceFile = resolve(process.cwd(), `vitest.workspace.browser.${lang}`);
|
|
625
|
-
}
|
|
626
|
-
scriptCommand = `vitest --workspace=${relative(process.cwd(), browserWorkspaceFile)}`;
|
|
627
|
-
await generateWorkspaceFile({
|
|
628
|
-
configPath: browserWorkspaceFile,
|
|
629
|
-
rootConfig,
|
|
630
|
-
provider,
|
|
631
|
-
browsers
|
|
632
|
-
});
|
|
633
|
-
log(c.green("\u2714"), "Created a workspace file for browser tests:", c.bold(relative(process.cwd(), browserWorkspaceFile)));
|
|
634
|
-
} else {
|
|
635
|
-
const configPath = resolve(process.cwd(), `vitest.config.${lang}`);
|
|
636
|
-
await generateFrameworkConfigFile({
|
|
637
|
-
configPath,
|
|
638
|
-
framework,
|
|
639
|
-
frameworkPlugin,
|
|
640
|
-
provider,
|
|
641
|
-
browsers
|
|
642
|
-
});
|
|
643
|
-
log(c.green("\u2714"), "Created a config file for browser tests", c.bold(relative(process.cwd(), configPath)));
|
|
644
|
-
}
|
|
645
|
-
log();
|
|
646
|
-
await updatePkgJsonScripts(pkgJsonPath, scriptCommand);
|
|
647
|
-
if (installPlaywright) {
|
|
648
|
-
log();
|
|
649
|
-
const [command, ...args] = getPlaywrightRunArgs(pkgManager);
|
|
650
|
-
const allArgs = [...args, "playwright", "install", "--with-deps"];
|
|
651
|
-
log(c.cyan("\u25FC"), `Installing Playwright dependencies with \`${c.bold(command)} ${c.bold(allArgs.join(" "))}\`...`);
|
|
652
|
-
log();
|
|
653
|
-
await x(command, allArgs, {
|
|
654
|
-
nodeOptions: {
|
|
655
|
-
stdio: ["pipe", "inherit", "inherit"]
|
|
656
|
-
}
|
|
657
|
-
});
|
|
658
|
-
}
|
|
659
|
-
if (lang === "ts") {
|
|
660
|
-
await updateTsConfig(providerPkg?.types);
|
|
661
|
-
}
|
|
662
|
-
log();
|
|
663
|
-
const exampleTestFile = await generateExampleFiles(framework, lang);
|
|
664
|
-
log(c.green("\u2714"), "Created example test file in", c.bold(relative(process.cwd(), exampleTestFile)));
|
|
665
|
-
log(c.dim(" You can safely delete this file once you have written your own tests."));
|
|
666
|
-
log();
|
|
667
|
-
log(c.cyan("\u25FC"), "All done! Run your tests with", c.bold(getRunScript(pkgManager)));
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
export { create };
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
const RealDate = Date;
|
|
2
|
-
let now = null;
|
|
3
|
-
class MockDate extends RealDate {
|
|
4
|
-
constructor(y, m, d, h, M, s, ms) {
|
|
5
|
-
super();
|
|
6
|
-
let date;
|
|
7
|
-
switch (arguments.length) {
|
|
8
|
-
case 0:
|
|
9
|
-
if (now !== null) {
|
|
10
|
-
date = new RealDate(now.valueOf());
|
|
11
|
-
} else {
|
|
12
|
-
date = new RealDate();
|
|
13
|
-
}
|
|
14
|
-
break;
|
|
15
|
-
case 1:
|
|
16
|
-
date = new RealDate(y);
|
|
17
|
-
break;
|
|
18
|
-
default:
|
|
19
|
-
d = typeof d === "undefined" ? 1 : d;
|
|
20
|
-
h = h || 0;
|
|
21
|
-
M = M || 0;
|
|
22
|
-
s = s || 0;
|
|
23
|
-
ms = ms || 0;
|
|
24
|
-
date = new RealDate(y, m, d, h, M, s, ms);
|
|
25
|
-
break;
|
|
26
|
-
}
|
|
27
|
-
Object.setPrototypeOf(date, MockDate.prototype);
|
|
28
|
-
return date;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
MockDate.UTC = RealDate.UTC;
|
|
32
|
-
MockDate.now = function() {
|
|
33
|
-
return new MockDate().valueOf();
|
|
34
|
-
};
|
|
35
|
-
MockDate.parse = function(dateString) {
|
|
36
|
-
return RealDate.parse(dateString);
|
|
37
|
-
};
|
|
38
|
-
MockDate.toString = function() {
|
|
39
|
-
return RealDate.toString();
|
|
40
|
-
};
|
|
41
|
-
function mockDate(date) {
|
|
42
|
-
const dateObj = new RealDate(date.valueOf());
|
|
43
|
-
if (Number.isNaN(dateObj.getTime())) {
|
|
44
|
-
throw new TypeError(`mockdate: The time set is an invalid date: ${date}`);
|
|
45
|
-
}
|
|
46
|
-
globalThis.Date = MockDate;
|
|
47
|
-
now = dateObj.valueOf();
|
|
48
|
-
}
|
|
49
|
-
function resetDate() {
|
|
50
|
-
globalThis.Date = RealDate;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export { RealDate as R, mockDate as m, resetDate as r };
|