vitest 3.0.9 → 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.
Files changed (85) hide show
  1. package/dist/browser.js +4 -4
  2. package/dist/chunks/base.CylSMlTD.js +41 -0
  3. package/dist/chunks/benchmark.BKUatJGy.js +39 -0
  4. package/dist/chunks/cac.JtTXbKz0.js +1525 -0
  5. package/dist/chunks/{cli-api.Ckwz_xSb.js → cli-api.BTtPTYMs.js} +4638 -5072
  6. package/dist/chunks/console.D6t261w0.js +173 -0
  7. package/dist/chunks/constants.BZZyIeIE.js +43 -0
  8. package/dist/chunks/coverage.0iPg4Wrz.js +33 -0
  9. package/dist/chunks/{coverage.gV8doR2Y.js → coverage.C2ohxaN0.js} +2216 -2479
  10. package/dist/chunks/creator.BEXek7yQ.js +640 -0
  11. package/dist/chunks/date.CDOsz-HY.js +53 -0
  12. package/dist/chunks/defaults.DmfNPoe5.js +114 -0
  13. package/dist/chunks/{env.D4Lgay0q.js → env.Dq0hM4Xv.js} +1 -1
  14. package/dist/chunks/execute.DZKwfrTs.js +791 -0
  15. package/dist/chunks/git.DXfdBEfR.js +74 -0
  16. package/dist/chunks/{globals.BEpDe-k3.js → globals.DCbUWjip.js} +10 -10
  17. package/dist/chunks/{index.D7Ny8f_s.js → index.BDobFbcz.js} +6 -7
  18. package/dist/chunks/index.DFXFpH3w.js +607 -0
  19. package/dist/chunks/index.VfYQ6MXY.js +104 -0
  20. package/dist/chunks/index.ZIOEXBQB.js +2382 -0
  21. package/dist/chunks/inspector.DbDkSkFn.js +54 -0
  22. package/dist/chunks/node.IqGoMrm4.js +15 -0
  23. package/dist/chunks/{reporters.d.CqBhtcTq.d.ts → reporters.d.5g6jXhoW.d.ts} +25 -8
  24. package/dist/chunks/rpc.DGgL5dw7.js +92 -0
  25. package/dist/chunks/run-once.I7PpBOk1.js +47 -0
  26. package/dist/chunks/runBaseTests.CqmKSG99.js +134 -0
  27. package/dist/chunks/setup-common.DEGDGBiA.js +88 -0
  28. package/dist/chunks/{typechecker.BlF3eHsb.js → typechecker.C2IpOhid.js} +620 -622
  29. package/dist/chunks/utils.BfxieIyZ.js +66 -0
  30. package/dist/chunks/utils.CtocqOoE.js +72 -0
  31. package/dist/chunks/utils.OLmtDstN.js +194 -0
  32. package/dist/chunks/{vi.nSCvwQ7l.js → vi.B-PuvDzu.js} +878 -1019
  33. package/dist/chunks/vite.d.Dh1jE-_V.d.ts +23 -0
  34. package/dist/chunks/vm.BW5voG-u.js +789 -0
  35. package/dist/cli.js +2 -2
  36. package/dist/config.cjs +97 -103
  37. package/dist/config.d.ts +3 -3
  38. package/dist/config.js +6 -6
  39. package/dist/coverage.d.ts +1 -1
  40. package/dist/coverage.js +6 -6
  41. package/dist/environments.js +1 -1
  42. package/dist/execute.js +1 -1
  43. package/dist/index.d.ts +2 -2
  44. package/dist/index.js +6 -6
  45. package/dist/node.d.ts +3 -3
  46. package/dist/node.js +36 -45
  47. package/dist/path.js +1 -4
  48. package/dist/reporters.d.ts +1 -1
  49. package/dist/reporters.js +4 -4
  50. package/dist/runners.js +231 -267
  51. package/dist/snapshot.js +2 -2
  52. package/dist/suite.js +2 -2
  53. package/dist/worker.js +98 -114
  54. package/dist/workers/forks.js +22 -22
  55. package/dist/workers/runVmTests.js +61 -66
  56. package/dist/workers/threads.js +13 -13
  57. package/dist/workers/vmForks.js +24 -24
  58. package/dist/workers/vmThreads.js +15 -15
  59. package/dist/workers.js +10 -10
  60. package/package.json +11 -11
  61. package/dist/chunks/base.DV59CbtV.js +0 -45
  62. package/dist/chunks/benchmark.DL72EVN-.js +0 -40
  63. package/dist/chunks/cac.CeVHgzve.js +0 -1659
  64. package/dist/chunks/console.CN7AiMGV.js +0 -179
  65. package/dist/chunks/constants.DTYd6dNH.js +0 -46
  66. package/dist/chunks/coverage.A3sS5-Wm.js +0 -40
  67. package/dist/chunks/creator.BsBnpTzI.js +0 -670
  68. package/dist/chunks/date.W2xKR2qe.js +0 -53
  69. package/dist/chunks/defaults.C2Ndd9wx.js +0 -119
  70. package/dist/chunks/execute.eDH0aFFd.js +0 -839
  71. package/dist/chunks/git.B5SDxu-n.js +0 -69
  72. package/dist/chunks/index.B8tIoLPT.js +0 -2526
  73. package/dist/chunks/index.K90BXFOx.js +0 -658
  74. package/dist/chunks/index.uXkkC4xl.js +0 -111
  75. package/dist/chunks/inspector.DKLceBVD.js +0 -54
  76. package/dist/chunks/node.AKq966Jp.js +0 -15
  77. package/dist/chunks/rpc.TVf73xOu.js +0 -102
  78. package/dist/chunks/run-once.2ogXb3JV.js +0 -28
  79. package/dist/chunks/runBaseTests.BVrL_ow3.js +0 -142
  80. package/dist/chunks/setup-common.CPvtqi8q.js +0 -96
  81. package/dist/chunks/utils.C8RiOc4B.js +0 -77
  82. package/dist/chunks/utils.Cn0zI1t3.js +0 -68
  83. package/dist/chunks/utils.bLM2atbD.js +0 -198
  84. package/dist/chunks/vite.d.BUZTGxQ3.d.ts +0 -11
  85. 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 };