diff --git a/.gitignore b/.gitignore
index 5e706fa10..d78c8f284 100644
--- a/.gitignore
+++ b/.gitignore
@@ -52,6 +52,9 @@ Thumbs.db
# Nx workspace cache
.nx
+# Bundled Vitest configuration files
+**/*.bundled_*.mjs
+
vite.config.*.timestamp*
vitest.config.*.timestamp*
.cursor/rules/nx-rules.mdc
diff --git a/e2e/ci-e2e/vitest.e2e.config.ts b/e2e/ci-e2e/vitest.e2e.config.ts
index 188911141..63848d98d 100644
--- a/e2e/ci-e2e/vitest.e2e.config.ts
+++ b/e2e/ci-e2e/vitest.e2e.config.ts
@@ -1,22 +1,19 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/ci-e2e',
- test: {
- reporters: ['basic'],
- testTimeout: 60_000,
- globals: true,
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- cache: {
- dir: '../../node_modules/.vitest',
+export default defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ globalSetup: './global-setup.ts',
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: './global-setup.ts',
- setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
- },
+ };
});
diff --git a/e2e/cli-e2e/vitest.e2e.config.ts b/e2e/cli-e2e/vitest.e2e.config.ts
index c2f8187bd..c0aab4060 100644
--- a/e2e/cli-e2e/vitest.e2e.config.ts
+++ b/e2e/cli-e2e/vitest.e2e.config.ts
@@ -1,21 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/cli-e2e',
- test: {
- reporters: ['basic'],
- testTimeout: 20_000,
- globals: true,
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- cache: {
- dir: '../../node_modules/.vitest',
- },
- environment: 'node',
- include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/e2e/create-cli-e2e/vitest.e2e.config.ts b/e2e/create-cli-e2e/vitest.e2e.config.ts
index 08534a740..c0aab4060 100644
--- a/e2e/create-cli-e2e/vitest.e2e.config.ts
+++ b/e2e/create-cli-e2e/vitest.e2e.config.ts
@@ -1,22 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/create-cli-e2e',
- test: {
- reporters: ['basic'],
- testTimeout: 20_000,
- hookTimeout: 20_000,
- globals: true,
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- cache: {
- dir: '../../node_modules/.vitest',
- },
- environment: 'node',
- include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/e2e/nx-plugin-e2e/vitest.e2e.config.ts b/e2e/nx-plugin-e2e/vitest.e2e.config.ts
index c0f955673..c0aab4060 100644
--- a/e2e/nx-plugin-e2e/vitest.e2e.config.ts
+++ b/e2e/nx-plugin-e2e/vitest.e2e.config.ts
@@ -1,21 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/nx-plugin-e2e',
- test: {
- reporters: ['basic'],
- testTimeout: 80_000,
- globals: true,
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- cache: {
- dir: '../../node_modules/.vitest',
- },
- environment: 'node',
- include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/e2e/plugin-coverage-e2e/vitest.e2e.config.ts b/e2e/plugin-coverage-e2e/vitest.e2e.config.ts
index 15ef3ba1a..c0aab4060 100644
--- a/e2e/plugin-coverage-e2e/vitest.e2e.config.ts
+++ b/e2e/plugin-coverage-e2e/vitest.e2e.config.ts
@@ -1,21 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-coverage-e2e',
- test: {
- reporters: ['basic'],
- testTimeout: 40_000,
- globals: true,
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- cache: {
- dir: '../../node_modules/.vitest',
- },
- environment: 'node',
- include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/e2e/plugin-eslint-e2e/vitest.e2e.config.ts b/e2e/plugin-eslint-e2e/vitest.e2e.config.ts
index 500fe0cd5..c0aab4060 100644
--- a/e2e/plugin-eslint-e2e/vitest.e2e.config.ts
+++ b/e2e/plugin-eslint-e2e/vitest.e2e.config.ts
@@ -1,21 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-lighthouse-e2e',
- test: {
- reporters: ['basic'],
- testTimeout: 20_000,
- globals: true,
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- cache: {
- dir: '../../node_modules/.vitest',
- },
- environment: 'node',
- include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/e2e/plugin-js-packages-e2e/vitest.e2e.config.ts b/e2e/plugin-js-packages-e2e/vitest.e2e.config.ts
index 8b8475ed1..c0aab4060 100644
--- a/e2e/plugin-js-packages-e2e/vitest.e2e.config.ts
+++ b/e2e/plugin-js-packages-e2e/vitest.e2e.config.ts
@@ -1,21 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-js-packages-e2e',
- test: {
- reporters: ['basic'],
- testTimeout: 120_000,
- globals: true,
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- cache: {
- dir: '../../node_modules/.vitest',
- },
- environment: 'node',
- include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/e2e/plugin-jsdocs-e2e/vitest.e2e.config.ts b/e2e/plugin-jsdocs-e2e/vitest.e2e.config.ts
index ecbc894ae..c0aab4060 100644
--- a/e2e/plugin-jsdocs-e2e/vitest.e2e.config.ts
+++ b/e2e/plugin-jsdocs-e2e/vitest.e2e.config.ts
@@ -1,21 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-jsdocs-e2e',
- test: {
- reporters: ['basic'],
- testTimeout: 20_000,
- globals: true,
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- cache: {
- dir: '../../node_modules/.vitest',
- },
- environment: 'node',
- include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/e2e/plugin-lighthouse-e2e/vitest.e2e.config.ts b/e2e/plugin-lighthouse-e2e/vitest.e2e.config.ts
index 1040920ff..c0aab4060 100644
--- a/e2e/plugin-lighthouse-e2e/vitest.e2e.config.ts
+++ b/e2e/plugin-lighthouse-e2e/vitest.e2e.config.ts
@@ -1,21 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-lighthouse-e2e',
- test: {
- reporters: ['basic'],
- testTimeout: 80_000,
- globals: true,
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- cache: {
- dir: '../../node_modules/.vitest',
- },
- environment: 'node',
- include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/e2e/plugin-typescript-e2e/vitest.e2e.config.ts b/e2e/plugin-typescript-e2e/vitest.e2e.config.ts
index 8f30d049b..c0aab4060 100644
--- a/e2e/plugin-typescript-e2e/vitest.e2e.config.ts
+++ b/e2e/plugin-typescript-e2e/vitest.e2e.config.ts
@@ -1,26 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-typescript-e2e',
- test: {
- reporters: ['basic'],
- testTimeout: 20_000,
- globals: true,
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-typescript-e2e/e2e-tests',
- exclude: ['mocks/**', '**/types.ts'],
- },
- cache: {
- dir: '../../node_modules/.vitest',
- },
- environment: 'node',
- include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/eslint.config.js b/eslint.config.js
index 5830ca0f7..921716aad 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -27,6 +27,7 @@ export default tseslint.config(
String.raw`^.*/eslint(\.base)?\.config\.[cm]?js$`,
String.raw`^.*/code-pushup\.(config|preset)(\.m?[jt]s)?$`,
'^[./]+/tools/.*$',
+ '^[./]+/testing/test-vitest-setup/.*$',
],
depConstraints: [
{
@@ -106,6 +107,12 @@ export default tseslint.config(
'vitest/expect-expect': 'off',
},
},
+ {
+ files: ['**/vitest.*.config.ts'],
+ rules: {
+ '@nx/enforce-module-boundaries': 'off',
+ },
+ },
{
files: ['**/*.json'],
languageOptions: { parser: jsoncParser },
@@ -131,6 +138,7 @@ export default tseslint.config(
'**/__snapshots__/**',
'**/dist',
'**/*.md',
+ '**/coverage/**',
],
},
);
diff --git a/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts b/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts
index 7ed289eed..9aab7503b 100644
--- a/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts
+++ b/examples/plugins/src/file-size/src/file-size.plugin.unit.test.ts
@@ -191,7 +191,7 @@ describe('runnerFunction', () => {
it('should return pass if no files are given and pass', async () => {
vol.reset();
- // create empty directory
+
vol.fromJSON(
{
'm.js': '',
diff --git a/examples/plugins/vitest.int.config.ts b/examples/plugins/vitest.int.config.ts
index 116936d7b..b9f8b6946 100644
--- a/examples/plugins/vitest.int.config.ts
+++ b/examples/plugins/vitest.int.config.ts
@@ -1,31 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/examples-plugins',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/examples-plugins/int-tests',
- exclude: ['**/mocks/**', '**/mock/**', 'code-pushup.config.ts'],
- },
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/git.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/examples/plugins/vitest.unit.config.ts b/examples/plugins/vitest.unit.config.ts
index a39e779dc..2457541c5 100644
--- a/examples/plugins/vitest.unit.config.ts
+++ b/examples/plugins/vitest.unit.config.ts
@@ -1,31 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/examples-plugins',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/examples-plugins/unit-tests',
- exclude: ['**/mocks/**', '**/mock/**', 'code-pushup.config.ts'],
- },
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/git.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/packages/ci/src/lib/monorepo/packages.unit.test.ts b/packages/ci/src/lib/monorepo/packages.unit.test.ts
index b7024e953..61466df19 100644
--- a/packages/ci/src/lib/monorepo/packages.unit.test.ts
+++ b/packages/ci/src/lib/monorepo/packages.unit.test.ts
@@ -55,7 +55,7 @@ describe('listPackages', () => {
vol.fromJSON(
{
'e2e/package.json': pkgJsonContent({ name: 'e2e' }),
- 'package.json': pkgJsonContent({ name: 'example-monorepo' }), // not in patterns
+ 'package.json': pkgJsonContent({ name: 'example-monorepo' }),
'packages/cli/package.json': pkgJsonContent({ name: '@example/cli' }),
'packages/core/package.json': pkgJsonContent({ name: '@example/core' }),
'scripts/docs/index.js': 'console.log("not yet implemented")', // no package.json
@@ -122,7 +122,7 @@ describe('listWorkspaces', () => {
workspaces: ['ui', 'api'],
}),
'api/package.json': pkgJsonContent({ name: 'api' }),
- 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), // not in workspaces
+ 'e2e/package.json': pkgJsonContent({ name: 'e2e' }),
'ui/package.json': pkgJsonContent({ name: 'ui' }),
},
MEMFS_VOLUME,
@@ -155,7 +155,7 @@ describe('listWorkspaces', () => {
private: true,
workspaces: ['packages/*'],
}),
- 'e2e/package.json': pkgJsonContent({ name: 'e2e' }), // not in workspaces
+ 'e2e/package.json': pkgJsonContent({ name: 'e2e' }),
'packages/cli/package.json': pkgJsonContent({ name: 'cli' }),
'packages/core/package.json': pkgJsonContent({ name: 'core' }),
},
diff --git a/packages/ci/vitest.int.config.ts b/packages/ci/vitest.int.config.ts
index dd5ebd0f9..b9f8b6946 100644
--- a/packages/ci/vitest.int.config.ts
+++ b/packages/ci/vitest.int.config.ts
@@ -1,29 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/ci',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/ci/int-tests',
- exclude: ['mocks/**', '**/types.ts'],
- },
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/packages/ci/vitest.unit.config.ts b/packages/ci/vitest.unit.config.ts
index a7b37b3fd..2457541c5 100644
--- a/packages/ci/vitest.unit.config.ts
+++ b/packages/ci/vitest.unit.config.ts
@@ -1,32 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/ci',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/ci/unit-tests',
- exclude: ['mocks/**', '**/types.ts'],
- },
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/git.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts',
- ],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/packages/cli/src/lib/autorun/autorun-command.unit.test.ts b/packages/cli/src/lib/autorun/autorun-command.unit.test.ts
index 040fb44c7..79d90c770 100644
--- a/packages/cli/src/lib/autorun/autorun-command.unit.test.ts
+++ b/packages/cli/src/lib/autorun/autorun-command.unit.test.ts
@@ -57,7 +57,6 @@ describe('autorun-command', () => {
}),
);
- // values come from CORE_CONFIG_MOCK returned by readRcByPath mock
expect(uploadReportToPortal).toHaveBeenCalledWith<
Parameters
>({
diff --git a/packages/cli/src/lib/upload/upload-command.unit.test.ts b/packages/cli/src/lib/upload/upload-command.unit.test.ts
index 7ffb7fbb1..1a99b482e 100644
--- a/packages/cli/src/lib/upload/upload-command.unit.test.ts
+++ b/packages/cli/src/lib/upload/upload-command.unit.test.ts
@@ -51,7 +51,6 @@ describe('upload-command-object', () => {
undefined,
);
- // values come from CORE_CONFIG_MOCK returned by readRcByPath mock
expect(uploadReportToPortal).toHaveBeenCalledWith<
Parameters
>({
diff --git a/packages/cli/vitest.int.config.ts b/packages/cli/vitest.int.config.ts
index 822df760a..34c2a1b04 100644
--- a/packages/cli/vitest.int.config.ts
+++ b/packages/cli/vitest.int.config.ts
@@ -1,29 +1,24 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/cli',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/cli/int-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ coverage: {
+ ...baseConfig.test.coverage,
+ exclude: [
+ ...baseConfig.test.coverage.exclude,
+ // CLI-specific excludes (already has mocks/** and **/types.ts)
+ ],
+ },
},
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+ };
});
diff --git a/packages/cli/vitest.unit.config.ts b/packages/cli/vitest.unit.config.ts
index cb4a01fb0..40cf4db98 100644
--- a/packages/cli/vitest.unit.config.ts
+++ b/packages/cli/vitest.unit.config.ts
@@ -1,34 +1,26 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/cli',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/cli/unit-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/cliui.mock.ts',
+ '../../testing/test-setup/src/lib/fs.mock.ts',
+ '../../testing/test-setup/src/lib/git.mock.ts',
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/portal-client.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
+ ],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/cliui.mock.ts',
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/git.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/portal-client.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
- ],
- },
+ };
});
diff --git a/packages/core/src/lib/implementation/execute-plugin.unit.test.ts b/packages/core/src/lib/implementation/execute-plugin.unit.test.ts
index 191e2f995..715cdd375 100644
--- a/packages/core/src/lib/implementation/execute-plugin.unit.test.ts
+++ b/packages/core/src/lib/implementation/execute-plugin.unit.test.ts
@@ -55,11 +55,11 @@ describe('executePlugin', () => {
const readRunnerResultsSpy = vi.spyOn(runnerModule, 'readRunnerResults');
const validRunnerResult = {
- duration: 0, // readRunnerResults now automatically sets this to 0 for cache hits
- date: new Date().toISOString(), // readRunnerResults sets this to current time
+ duration: 0,
+ date: new Date().toISOString(),
audits: [
{
- slug: 'node-version', // Must match the plugin config audit slug for enrichment
+ slug: 'node-version',
score: 0.3,
value: 16,
},
diff --git a/packages/core/src/lib/implementation/read-rc-file.unit.test.ts b/packages/core/src/lib/implementation/read-rc-file.unit.test.ts
index d9c5e2001..e0a77bd5c 100644
--- a/packages/core/src/lib/implementation/read-rc-file.unit.test.ts
+++ b/packages/core/src/lib/implementation/read-rc-file.unit.test.ts
@@ -4,7 +4,6 @@ import { CONFIG_FILE_NAME, type CoreConfig } from '@code-pushup/models';
import { MEMFS_VOLUME } from '@code-pushup/test-utils';
import { autoloadRc } from './read-rc-file.js';
-// mock bundleRequire inside importEsmModule used for fetching config
vi.mock('bundle-require', async () => {
const { CORE_CONFIG_MOCK }: Record =
await vi.importActual('@code-pushup/test-utils');
@@ -29,7 +28,6 @@ vi.mock('bundle-require', async () => {
};
});
-// Note: memfs files are only listed to satisfy a system check, value is used from bundle-require mock
describe('autoloadRc', () => {
it('prioritise a .ts configuration file', async () => {
vol.fromJSON(
diff --git a/packages/core/src/lib/merge-diffs.unit.test.ts b/packages/core/src/lib/merge-diffs.unit.test.ts
index ef529e1dc..2ba583cd4 100644
--- a/packages/core/src/lib/merge-diffs.unit.test.ts
+++ b/packages/core/src/lib/merge-diffs.unit.test.ts
@@ -44,7 +44,7 @@ describe('mergeDiffs', () => {
const outputPath = await mergeDiffs(files, persistConfig);
const markdown = await readFile(outputPath, 'utf8');
- // `website` is unchanged, therefore not mentioned by name
+
expect(markdown).toContain('## 💼 Project `console`');
expect(markdown).toContain('## 💼 Project `admin`');
expect(markdown).toContain('## 💼 Project `docs`');
diff --git a/packages/core/vitest.int.config.ts b/packages/core/vitest.int.config.ts
index 819c3a5bb..136654150 100644
--- a/packages/core/vitest.int.config.ts
+++ b/packages/core/vitest.int.config.ts
@@ -1,30 +1,21 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/core',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/core/int-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ ],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/portal-client.mock.ts',
- ],
- },
+ };
});
diff --git a/packages/core/vitest.unit.config.ts b/packages/core/vitest.unit.config.ts
index 820eb538c..03b7eab2c 100644
--- a/packages/core/vitest.unit.config.ts
+++ b/packages/core/vitest.unit.config.ts
@@ -1,36 +1,17 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/core',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/core/unit-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
},
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/cliui.mock.ts',
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/git.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/portal-client.mock.ts',
- '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
- '../../testing/test-setup/src/lib/extend/markdown-table.matcher.ts',
- '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts',
- ],
- },
+ };
});
diff --git a/packages/create-cli/src/lib/init.unit.test.ts b/packages/create-cli/src/lib/init.unit.test.ts
index e231b0dfb..785ee71eb 100644
--- a/packages/create-cli/src/lib/init.unit.test.ts
+++ b/packages/create-cli/src/lib/init.unit.test.ts
@@ -22,7 +22,6 @@ describe('initCodePushup', () => {
const spyTeardownNxContext = vi.spyOn(createUtils, 'teardownNxContext');
beforeEach(() => {
- // needed to get test folder set up
vol.fromJSON(
{
'random-file': '',
diff --git a/packages/create-cli/vitest.unit.config.ts b/packages/create-cli/vitest.unit.config.ts
index b990c0c6f..2457541c5 100644
--- a/packages/create-cli/vitest.unit.config.ts
+++ b/packages/create-cli/vitest.unit.config.ts
@@ -1,30 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/create-cli',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/create-cli/unit-tests',
- exclude: ['mocks/**', '**/types.ts'],
- },
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/packages/models/transformers/src/lib/transformers.ts b/packages/models/transformers/src/lib/transformers.ts
index b61f19455..8b0b4634a 100644
--- a/packages/models/transformers/src/lib/transformers.ts
+++ b/packages/models/transformers/src/lib/transformers.ts
@@ -41,9 +41,8 @@ function annotateTypeDefinitions(
}
return tsLib.visitEachChild(node, visitor, context);
};
- return (sourceFile: ts.SourceFile) => {
- return tsLib.visitNode(sourceFile, visitor, tsLib.isSourceFile);
- };
+ return (sourceFile: ts.SourceFile) =>
+ tsLib.visitNode(sourceFile, visitor, tsLib.isSourceFile);
};
}
diff --git a/packages/models/vitest.unit.config.ts b/packages/models/vitest.unit.config.ts
index 386a073db..52a7af70c 100644
--- a/packages/models/vitest.unit.config.ts
+++ b/packages/models/vitest.unit.config.ts
@@ -1,30 +1,25 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/models',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/models/unit-tests',
- exclude: ['mocks/**', '**/types.ts', 'zod2md.config.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/fs.mock.ts',
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ ],
+ coverage: {
+ ...baseConfig.test.coverage,
+ exclude: [...baseConfig.test.coverage.exclude, 'zod2md.config.ts'],
+ },
},
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+ };
});
diff --git a/packages/nx-plugin/src/plugin/target/targets.unit.test.ts b/packages/nx-plugin/src/plugin/target/targets.unit.test.ts
index 9b730f726..8833b5cc8 100644
--- a/packages/nx-plugin/src/plugin/target/targets.unit.test.ts
+++ b/packages/nx-plugin/src/plugin/target/targets.unit.test.ts
@@ -9,7 +9,6 @@ import { createTargets } from './targets.js';
describe('createTargets', () => {
beforeEach(async () => {
- // needed to have the folder present. readdir otherwise it fails
vol.fromJSON(
{
x: '',
diff --git a/packages/nx-plugin/vitest.int.config.ts b/packages/nx-plugin/vitest.int.config.ts
index 25d5530d1..b9f8b6946 100644
--- a/packages/nx-plugin/vitest.int.config.ts
+++ b/packages/nx-plugin/vitest.int.config.ts
@@ -1,28 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/nx-plugin',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/nx-plugin/int-tests',
- exclude: ['mocks/**', '**/types.ts', '**/__snapshots__/**'],
- },
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: [
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/packages/nx-plugin/vitest.unit.config.ts b/packages/nx-plugin/vitest.unit.config.ts
index db557f696..2457541c5 100644
--- a/packages/nx-plugin/vitest.unit.config.ts
+++ b/packages/nx-plugin/vitest.unit.config.ts
@@ -1,29 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/nx-plugin',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/nx-plugin/unit-tests',
- exclude: ['mocks/**', '**/types.ts', '**/__snapshots__/**'],
- },
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- setupFiles: [
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/packages/plugin-coverage/src/lib/nx/coverage-paths.ts b/packages/plugin-coverage/src/lib/nx/coverage-paths.ts
index 5f587e33b..0b6c2e2f2 100644
--- a/packages/plugin-coverage/src/lib/nx/coverage-paths.ts
+++ b/packages/plugin-coverage/src/lib/nx/coverage-paths.ts
@@ -81,8 +81,12 @@ function hasNxTarget(
export type VitestCoverageConfig = {
test: {
coverage?: {
+ enabled?: boolean;
+ provider?: string;
reporter?: string[];
reportsDirectory?: string;
+ include?: string[];
+ exclude?: string[];
};
};
};
diff --git a/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts b/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts
index 8d57dba34..d93d17551 100644
--- a/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts
+++ b/packages/plugin-coverage/src/lib/nx/coverage-paths.unit.test.ts
@@ -86,7 +86,6 @@ describe('getCoveragePathForTarget', () => {
beforeEach(() => {
vol.fromJSON(
{
- // values come from bundle-require mock above
'vitest-valid.config.ts': '',
'jest-valid.config.ts': '',
},
@@ -162,7 +161,6 @@ describe('getCoveragePathForVitest', () => {
beforeEach(() => {
vol.fromJSON(
{
- // values come from bundle-require mock above
'vitest-valid.config.unit.ts': '',
'vitest-no-dir.config.integration.ts': '',
'vitest-no-lcov.config.integration.ts': '',
@@ -260,7 +258,6 @@ describe('getCoveragePathForJest', () => {
beforeEach(() => {
vol.fromJSON(
{
- // values come from bundle-require mock above
'jest-valid.config.unit.ts': '',
'jest-no-dir.config.integration.ts': '',
'jest-no-lcov.config.integration.ts': '',
diff --git a/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts b/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts
index b943b04f0..7dd3bb6b4 100644
--- a/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts
+++ b/packages/plugin-coverage/src/lib/runner/lcov/lcov-runner.unit.test.ts
@@ -80,11 +80,11 @@ end_of_record
beforeEach(() => {
vol.fromJSON(
{
- [path.join('integration-tests', 'lcov.info')]: UTILS_REPORT, // file name value under SF used in tests
- [path.join('unit-tests', 'lcov.info')]: CONSTANTS_REPORT, // file name value under SF used in tests
+ [path.join('integration-tests', 'lcov.info')]: UTILS_REPORT,
+ [path.join('unit-tests', 'lcov.info')]: CONSTANTS_REPORT,
[path.join('pytest', 'lcov.info')]: PYTEST_REPORT,
[path.join('multi', 'lcov.info')]: MULTI_FILE_REPORT,
- 'lcov.info': '', // empty report file
+ 'lcov.info': '',
},
'coverage',
);
@@ -160,11 +160,8 @@ end_of_record
expect.objectContaining({
lines: {
found: 2,
- hit: 2, // not 3
- details: [
- { hit: 1, line: 1 },
- // no { hit: 0, line: 0 },
- ],
+ hit: 2,
+ details: [{ hit: 1, line: 1 }],
},
}),
]);
diff --git a/packages/plugin-coverage/vitest.int.config.ts b/packages/plugin-coverage/vitest.int.config.ts
index 1386d8f90..b36b3cf62 100644
--- a/packages/plugin-coverage/vitest.int.config.ts
+++ b/packages/plugin-coverage/vitest.int.config.ts
@@ -1,29 +1,24 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-coverage',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-coverage/int-tests',
- exclude: ['mocks/**', '**/types.ts', '**/vitest.*.config.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ ],
+ coverage: {
+ ...baseConfig.test.coverage,
+ exclude: [...baseConfig.test.coverage.exclude, '**/vitest.*.config.ts'],
+ },
},
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+ };
});
diff --git a/packages/plugin-coverage/vitest.unit.config.ts b/packages/plugin-coverage/vitest.unit.config.ts
index e0bd6113e..3beb7dc75 100644
--- a/packages/plugin-coverage/vitest.unit.config.ts
+++ b/packages/plugin-coverage/vitest.unit.config.ts
@@ -1,32 +1,20 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-coverage',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-coverage/unit-tests',
- exclude: ['mocks/**', '**/types.ts', '**/vitest.*.config.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ coverage: {
+ ...baseConfig.test.coverage,
+ exclude: [...baseConfig.test.coverage.exclude, '**/vitest.*.config.ts'],
+ },
},
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/cliui.mock.ts',
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
- ],
- },
+ };
});
diff --git a/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts b/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts
index 108dd16b1..05f292f7a 100644
--- a/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts
+++ b/packages/plugin-eslint/src/lib/runner/transform.unit.test.ts
@@ -68,7 +68,7 @@ describe('lintResultsToAudits', () => {
message: 'Specify the rules you want to disable',
severity: 1,
line: 1,
- column: 0, // testing we omit non-positive columns
+ column: 0,
},
],
},
diff --git a/packages/plugin-eslint/vitest.int.config.ts b/packages/plugin-eslint/vitest.int.config.ts
index 4019fef85..136654150 100644
--- a/packages/plugin-eslint/vitest.int.config.ts
+++ b/packages/plugin-eslint/vitest.int.config.ts
@@ -1,29 +1,21 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-eslint',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-eslint/int-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ ],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+ };
});
diff --git a/packages/plugin-eslint/vitest.unit.config.ts b/packages/plugin-eslint/vitest.unit.config.ts
index 65695242a..928bf2a1a 100644
--- a/packages/plugin-eslint/vitest.unit.config.ts
+++ b/packages/plugin-eslint/vitest.unit.config.ts
@@ -1,32 +1,25 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-eslint',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-eslint/unit-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/fs.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ '../../testing/test-setup/src/lib/cliui.mock.ts',
+ '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
+ ],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/cliui.mock.ts',
- '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
- ],
- },
+ };
});
diff --git a/packages/plugin-js-packages/vitest.int.config.ts b/packages/plugin-js-packages/vitest.int.config.ts
index aee4b57a1..136654150 100644
--- a/packages/plugin-js-packages/vitest.int.config.ts
+++ b/packages/plugin-js-packages/vitest.int.config.ts
@@ -1,29 +1,21 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-js-packages',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-js-packages/int-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ ],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+ };
});
diff --git a/packages/plugin-js-packages/vitest.unit.config.ts b/packages/plugin-js-packages/vitest.unit.config.ts
index 68f80bdce..81e6d4471 100644
--- a/packages/plugin-js-packages/vitest.unit.config.ts
+++ b/packages/plugin-js-packages/vitest.unit.config.ts
@@ -1,30 +1,22 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-js-packages',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-js-packages/unit-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/fs.mock.ts',
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ ],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+ };
});
diff --git a/packages/plugin-jsdocs/vitest.int.config.ts b/packages/plugin-jsdocs/vitest.int.config.ts
index 52301cf7d..136654150 100644
--- a/packages/plugin-jsdocs/vitest.int.config.ts
+++ b/packages/plugin-jsdocs/vitest.int.config.ts
@@ -1,30 +1,21 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-coverage',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-jsdocs/int-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ ],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/extend/path.matcher.ts',
- ],
- },
+ };
});
diff --git a/packages/plugin-jsdocs/vitest.unit.config.ts b/packages/plugin-jsdocs/vitest.unit.config.ts
index 048851c63..dd2c3e0fa 100644
--- a/packages/plugin-jsdocs/vitest.unit.config.ts
+++ b/packages/plugin-jsdocs/vitest.unit.config.ts
@@ -1,32 +1,24 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-coverage',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-jsdocs/unit-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/cliui.mock.ts',
+ '../../testing/test-setup/src/lib/fs.mock.ts',
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ '../../testing/test-setup/src/lib/extend/path.matcher.ts',
+ ],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/cliui.mock.ts',
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/extend/path.matcher.ts',
- ],
- },
+ };
});
diff --git a/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts
index 7774df24f..8b6064b88 100644
--- a/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts
+++ b/packages/plugin-lighthouse/src/lib/runner/runner.unit.test.ts
@@ -8,16 +8,14 @@ import { createRunnerFunction } from './runner.js';
import type { LighthouseCliFlags } from './types.js';
import { enrichFlags, getConfig } from './utils.js';
-// used for createRunnerMocking
vi.mock('./utils', async () => {
- // Import the actual 'lighthouse' module
const actual = await vi.importActual('./utils');
const actualEnrichFlags = actual['enrichFlags'] as (
f: LighthouseCliFlags,
i?: number,
) => string;
- // Return the mocked module, merging the actual module with overridden parts
+
return {
...actual,
enrichFlags: vi.fn().mockImplementation(actualEnrichFlags),
@@ -27,9 +25,8 @@ vi.mock('./utils', async () => {
});
vi.mock('lighthouse/cli/run.js', async () => {
- // Import the actual 'lighthouse' module
const actual = await import('lighthouse/cli/run.js');
- // Define the mock implementation
+
const mockRunLighthouse = vi.fn(
(url: string, flags: LighthouseCliFlags, config: Config) =>
url.includes('fail')
@@ -54,10 +51,9 @@ vi.mock('lighthouse/cli/run.js', async () => {
},
);
- // Return the mocked module, merging the actual module with overridden parts
return {
...actual,
- runLighthouse: mockRunLighthouse, // Mock the default export if 'lighthouse' is imported as default
+ runLighthouse: mockRunLighthouse,
};
});
diff --git a/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts b/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts
index 93cdff927..3e39389fc 100644
--- a/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts
+++ b/packages/plugin-lighthouse/src/lib/runner/utils.unit.test.ts
@@ -24,7 +24,6 @@ import {
toAuditOutputs,
} from './utils.js';
-// mock bundleRequire inside importEsmModule used for fetching config
vi.mock('bundle-require', async () => {
const { CORE_CONFIG_MOCK }: Record =
await vi.importActual('@code-pushup/test-utils');
diff --git a/packages/plugin-lighthouse/vitest.unit.config.ts b/packages/plugin-lighthouse/vitest.unit.config.ts
index 6739ccd4c..60060c05a 100644
--- a/packages/plugin-lighthouse/vitest.unit.config.ts
+++ b/packages/plugin-lighthouse/vitest.unit.config.ts
@@ -1,33 +1,25 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-lighthouse',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-lighthouse/unit-tests',
- exclude: ['mocks/**', '**/types.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/cliui.mock.ts',
+ '../../testing/test-setup/src/lib/fs.mock.ts',
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ '../../testing/test-setup/src/lib/extend/path.matcher.ts',
+ '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
+ ],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/cliui.mock.ts',
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/extend/path.matcher.ts',
- '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
- ],
- },
+ };
});
diff --git a/packages/plugin-typescript/src/lib/runner/runner.unit.test.ts b/packages/plugin-typescript/src/lib/runner/runner.unit.test.ts
index 58776c291..74ea2518e 100644
--- a/packages/plugin-typescript/src/lib/runner/runner.unit.test.ts
+++ b/packages/plugin-typescript/src/lib/runner/runner.unit.test.ts
@@ -22,8 +22,8 @@ describe('createRunnerFunction', () => {
const semanticTsCode = 2322;
const mockSemanticDiagnostic = {
- code: semanticTsCode, // "Type 'string' is not assignable to type 'number'"
- start: 10, // Mocked character position
+ code: semanticTsCode,
+ start: 10,
messageText: "Type 'string' is not assignable to type 'number'.",
category: DiagnosticCategory.Error,
file: {
@@ -34,7 +34,7 @@ describe('createRunnerFunction', () => {
const syntacticTsCode = 1005;
const mockSyntacticDiagnostic = {
code: syntacticTsCode, // "';' expected."
- start: 25, // Mocked character position
+ start: 25,
messageText: "';' expected.",
category: DiagnosticCategory.Error,
file: {
diff --git a/packages/plugin-typescript/vitest.int.config.ts b/packages/plugin-typescript/vitest.int.config.ts
index 87ad2157a..1c2671e1c 100644
--- a/packages/plugin-typescript/vitest.int.config.ts
+++ b/packages/plugin-typescript/vitest.int.config.ts
@@ -1,35 +1,22 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-typescript',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest/plugin-typescript',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-typescript/int-tests',
- exclude: [
- 'mocks/**',
- '**/types.ts',
- '**/index.ts',
- 'vitest.{unit,int}.config.ts',
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/cliui.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ '../../testing/test-setup/src/lib/chrome-path.mock.ts',
],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/cliui.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/chrome-path.mock.ts',
- ],
- },
+ };
});
diff --git a/packages/plugin-typescript/vitest.unit.config.ts b/packages/plugin-typescript/vitest.unit.config.ts
index 7046393e3..046a97d22 100644
--- a/packages/plugin-typescript/vitest.unit.config.ts
+++ b/packages/plugin-typescript/vitest.unit.config.ts
@@ -1,37 +1,24 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/plugin-typescript',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest/plugin-typescript',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/plugin-typescript/unit-tests',
- exclude: [
- 'mocks/**',
- '**/types.ts',
- '**/index.ts',
- 'vitest.{unit,int}.config.ts',
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ '../../testing/test-setup/src/lib/cliui.mock.ts',
+ '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
+ '../../testing/test-setup/src/lib/fs.mock.ts',
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/cliui.mock.ts',
- '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+ };
});
diff --git a/packages/utils/src/lib/git/git.unit.test.ts b/packages/utils/src/lib/git/git.unit.test.ts
index c38563939..fa8064e4f 100644
--- a/packages/utils/src/lib/git/git.unit.test.ts
+++ b/packages/utils/src/lib/git/git.unit.test.ts
@@ -27,7 +27,6 @@ describe('formatGitPath', () => {
});
it('returns relative Unix path for a relative path within current working directory', () => {
- // Mocking process.cwd() to return a specific path
vi.spyOn(process, 'cwd').mockReturnValue('/Users/user/Projects/myProject');
const path = 'src/index.js';
const gitRoot = '/Users/user/Projects/myProject';
diff --git a/packages/utils/src/lib/reports/log-stdout-summary.int.test.ts b/packages/utils/src/lib/reports/log-stdout-summary.int.test.ts
index b4d7c5fc4..454feede9 100644
--- a/packages/utils/src/lib/reports/log-stdout-summary.int.test.ts
+++ b/packages/utils/src/lib/reports/log-stdout-summary.int.test.ts
@@ -10,7 +10,7 @@ describe('logStdoutSummary', () => {
beforeAll(() => {
logs = [];
- // console.log is used inside the logger when in "normal" mode
+
vi.spyOn(console, 'log').mockImplementation(msg => {
logs = [...logs, msg];
});
diff --git a/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts b/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts
index 302fa4328..830c739a6 100644
--- a/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts
+++ b/packages/utils/src/lib/reports/log-stdout-summary.unit.test.ts
@@ -13,7 +13,7 @@ describe('logCategories', () => {
beforeAll(() => {
logs = [];
- // console.log is used inside the logger when in "normal" mode
+
vi.spyOn(console, 'log').mockImplementation(msg => {
logs = [...logs, msg];
});
diff --git a/packages/utils/vitest.int.config.ts b/packages/utils/vitest.int.config.ts
index 61c01ddad..b9f8b6946 100644
--- a/packages/utils/vitest.int.config.ts
+++ b/packages/utils/vitest.int.config.ts
@@ -1,30 +1,14 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedIntegrationVitestConfig } from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/utils',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/utils/int-tests',
- exclude: ['mocks/**', 'perf/**', '**/types.ts'],
- },
- environment: 'node',
- include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/cliui.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- ],
- },
+export default defineConfig(() => {
+ const baseConfig = createSharedIntegrationVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/packages/utils/vitest.unit.config.ts b/packages/utils/vitest.unit.config.ts
index ac74f7af6..f5e1f1e37 100644
--- a/packages/utils/vitest.unit.config.ts
+++ b/packages/utils/vitest.unit.config.ts
@@ -1,38 +1,28 @@
-///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import {
+ TYPE_TEST_CONFIG,
+ createSharedUnitVitestConfig,
+} from '../../testing/test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../../node_modules/.vite/utils',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/utils/unit-tests',
- exclude: ['mocks/**', 'perf/**', '**/types.ts'],
- },
- environment: 'node',
- include: ['src/**/*.{unit,type}.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
- typecheck: {
- include: ['**/*.type.test.ts'],
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ ...TYPE_TEST_CONFIG,
+ setupFiles: [
+ ...baseConfig.test.setupFiles,
+ '../../testing/test-setup/src/lib/extend/path.matcher.ts',
+ ],
+ coverage: {
+ ...baseConfig.test.coverage,
+ exclude: [...baseConfig.test.coverage.exclude, 'perf/**'],
+ },
},
- globalSetup: ['../../global-setup.ts'],
- setupFiles: [
- '../../testing/test-setup/src/lib/cliui.mock.ts',
- '../../testing/test-setup/src/lib/fs.mock.ts',
- '../../testing/test-setup/src/lib/console.mock.ts',
- '../../testing/test-setup/src/lib/reset.mocks.ts',
- '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
- '../../testing/test-setup/src/lib/extend/markdown-table.matcher.ts',
- '../../testing/test-setup/src/lib/extend/path.matcher.ts',
- '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts',
- ],
- },
+ };
});
diff --git a/testing/test-nx-utils/vitest.unit.config.ts b/testing/test-nx-utils/vitest.unit.config.ts
index b5a305cc1..c18cd237a 100644
--- a/testing/test-nx-utils/vitest.unit.config.ts
+++ b/testing/test-nx-utils/vitest.unit.config.ts
@@ -1,24 +1,17 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../node_modules/.vite/test-nx-utils',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../node_modules/.vitest',
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig(
+ {
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
},
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/test-nx-utils/unit-tests',
- exclude: ['**/*.mock.{mjs,ts}', '**/*.config.{js,mjs,ts}'],
- },
- environment: 'node',
- include: ['src/**/*.unit.test.ts'],
- },
+ true,
+ ); // noFsCwd = true for test-nx-utils
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/testing/test-setup/src/lib/fs-memfs.setup-file.ts b/testing/test-setup/src/lib/fs-memfs.setup-file.ts
new file mode 100644
index 000000000..21e4530e6
--- /dev/null
+++ b/testing/test-setup/src/lib/fs-memfs.setup-file.ts
@@ -0,0 +1,12 @@
+import { vi } from 'vitest';
+
+// Mock fs and fs/promises to use memfs
+vi.mock('fs', async () => {
+ const memfs: typeof import('memfs') = await vi.importActual('memfs');
+ return memfs.fs;
+});
+
+vi.mock('fs/promises', async () => {
+ const memfs: typeof import('memfs') = await vi.importActual('memfs');
+ return memfs.fs.promises;
+});
diff --git a/testing/test-setup/src/lib/fs-only.mock.ts b/testing/test-setup/src/lib/fs-only.mock.ts
new file mode 100644
index 000000000..bd93ffc74
--- /dev/null
+++ b/testing/test-setup/src/lib/fs-only.mock.ts
@@ -0,0 +1,12 @@
+import { vi } from 'vitest';
+
+// Mock only fs modules, not process.cwd()
+// This allows tests to mock process.cwd() themselves
+vi.mock('fs', async () => {
+ const memfs: typeof import('memfs') = await vi.importActual('memfs');
+ return memfs.fs;
+});
+vi.mock('fs/promises', async () => {
+ const memfs: typeof import('memfs') = await vi.importActual('memfs');
+ return memfs.fs.promises;
+});
diff --git a/testing/test-setup/src/lib/fs-with-cwd.setup-file.ts b/testing/test-setup/src/lib/fs-with-cwd.setup-file.ts
new file mode 100644
index 000000000..3282e9dd5
--- /dev/null
+++ b/testing/test-setup/src/lib/fs-with-cwd.setup-file.ts
@@ -0,0 +1,24 @@
+import { type MockInstance, afterEach, beforeEach, vi } from 'vitest';
+import { MEMFS_VOLUME } from '@code-pushup/test-utils';
+
+// Mock fs, fs/promises AND process.cwd() for full memfs environment
+vi.mock('fs', async () => {
+ const memfs: typeof import('memfs') = await vi.importActual('memfs');
+ return memfs.fs;
+});
+
+vi.mock('fs/promises', async () => {
+ const memfs: typeof import('memfs') = await vi.importActual('memfs');
+ return memfs.fs.promises;
+});
+
+// eslint-disable-next-line functional/no-let -- Mock spy needs to be reassignable
+let cwdSpy: MockInstance<[], string> | undefined;
+
+beforeEach(() => {
+ cwdSpy = vi.spyOn(process, 'cwd').mockReturnValue(MEMFS_VOLUME);
+});
+
+afterEach(() => {
+ cwdSpy?.mockRestore();
+});
diff --git a/testing/test-setup/vitest.unit.config.ts b/testing/test-setup/vitest.unit.config.ts
index 9a8966612..d1c75fd2c 100644
--- a/testing/test-setup/vitest.unit.config.ts
+++ b/testing/test-setup/vitest.unit.config.ts
@@ -1,29 +1,22 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../node_modules/.vite/test-setup',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../node_modules/.vitest',
- },
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/test-setup/unit-tests',
- exclude: ['**/*.mock.{mjs,ts}', '**/*.config.{js,mjs,ts}'],
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig({
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ setupFiles: [
+ ...baseConfig.test.setupFiles,
+ 'src/lib/extend/path.matcher.ts',
+ ],
+ coverage: baseConfig.test.coverage,
},
- environment: 'node',
- include: ['src/**/*.unit.test.ts'],
- setupFiles: [
- '../test-setup/src/lib/reset.mocks.ts',
- '../test-setup/src/lib/extend/path.matcher.ts',
- '../test-setup/src/lib/extend/markdown-table.matcher.ts',
- ],
- },
+ };
});
diff --git a/testing/test-utils/vitest.unit.config.ts b/testing/test-utils/vitest.unit.config.ts
index 8d5f0328f..0d3bcea5e 100644
--- a/testing/test-utils/vitest.unit.config.ts
+++ b/testing/test-utils/vitest.unit.config.ts
@@ -1,24 +1,17 @@
///
-import { defineConfig } from 'vite';
-import { tsconfigPathAliases } from '../../tools/vitest-tsconfig-path-aliases.js';
+import { defineConfig } from 'vitest/config';
+import { createSharedUnitVitestConfig } from '../test-vitest-setup/src/utils/project-config.js';
-export default defineConfig({
- cacheDir: '../node_modules/.vite/test-utils',
- test: {
- reporters: ['basic'],
- globals: true,
- cache: {
- dir: '../node_modules/.vitest',
+export default defineConfig(() => {
+ const baseConfig = createSharedUnitVitestConfig(
+ {
+ projectRoot: __dirname,
+ workspaceRoot: '../..',
},
- alias: tsconfigPathAliases(),
- pool: 'threads',
- poolOptions: { threads: { singleThread: true } },
- coverage: {
- reporter: ['text', 'lcov'],
- reportsDirectory: '../../coverage/test-utils/unit-tests',
- exclude: ['**/*.mock.{mjs,ts}', '**/*.config.{js,mjs,ts}'],
- },
- environment: 'node',
- include: ['src/**/*.unit.test.ts'],
- },
+ true,
+ ); // noFsCwd = true for test-utils
+
+ return {
+ ...baseConfig,
+ };
});
diff --git a/testing/test-vitest-setup/eslint.config.js b/testing/test-vitest-setup/eslint.config.js
new file mode 100644
index 000000000..2656b27cb
--- /dev/null
+++ b/testing/test-vitest-setup/eslint.config.js
@@ -0,0 +1,12 @@
+import tseslint from 'typescript-eslint';
+import baseConfig from '../../eslint.config.js';
+
+export default tseslint.config(...baseConfig, {
+ files: ['**/*.ts'],
+ languageOptions: {
+ parserOptions: {
+ projectService: true,
+ tsconfigRootDir: import.meta.dirname,
+ },
+ },
+});
diff --git a/testing/test-vitest-setup/package.json b/testing/test-vitest-setup/package.json
new file mode 100644
index 000000000..af1cf4c55
--- /dev/null
+++ b/testing/test-vitest-setup/package.json
@@ -0,0 +1,4 @@
+{
+ "name": "@code-pushup/test-vitest-setup",
+ "type": "module"
+}
diff --git a/testing/test-vitest-setup/project.json b/testing/test-vitest-setup/project.json
new file mode 100644
index 000000000..ecaf9afe5
--- /dev/null
+++ b/testing/test-vitest-setup/project.json
@@ -0,0 +1,11 @@
+{
+ "name": "test-vitest-setup",
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
+ "sourceRoot": "testing/test-vitest-setup/src",
+ "projectType": "library",
+ "targets": {
+ "build": {},
+ "lint": {}
+ },
+ "tags": ["scope:shared", "type:testing"]
+}
diff --git a/testing/test-vitest-setup/src/configs/base.ts b/testing/test-vitest-setup/src/configs/base.ts
new file mode 100644
index 000000000..be7a133c1
--- /dev/null
+++ b/testing/test-vitest-setup/src/configs/base.ts
@@ -0,0 +1,19 @@
+///
+import { defineConfig } from 'vitest/config';
+import { tsconfigPathAliases } from '../utils/tsconfig-path-aliases.js';
+
+export const baseTestConfig = defineConfig({
+ test: {
+ reporters: ['basic'],
+ globals: true,
+ cache: {
+ dir: '../../node_modules/.vitest',
+ },
+ alias: tsconfigPathAliases(),
+ pool: 'threads',
+ poolOptions: { threads: { singleThread: true } },
+ environment: 'node',
+ globalSetup: ['../../global-setup.ts'],
+ setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
+ },
+});
diff --git a/testing/test-vitest-setup/src/configs/e2e.ts b/testing/test-vitest-setup/src/configs/e2e.ts
new file mode 100644
index 000000000..07df42a02
--- /dev/null
+++ b/testing/test-vitest-setup/src/configs/e2e.ts
@@ -0,0 +1,22 @@
+///
+import { defineConfig } from 'vitest/config';
+import { createSharedE2eVitestConfig } from '../utils/project-config.js';
+
+export const e2eTestConfig = defineConfig(() => {
+ const baseConfig = createSharedE2eVitestConfig({
+ projectRoot: process.cwd(),
+ workspaceRoot: '../..',
+ });
+
+ return {
+ ...baseConfig,
+ test: {
+ ...baseConfig.test,
+ include: ['tests/**/*.e2e.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
+ setupFiles: ['../../testing/test-setup/src/lib/reset.mocks.ts'],
+ coverage: {
+ enabled: false,
+ },
+ },
+ };
+});
diff --git a/testing/test-vitest-setup/src/configs/int.ts b/testing/test-vitest-setup/src/configs/int.ts
new file mode 100644
index 000000000..f476b2803
--- /dev/null
+++ b/testing/test-vitest-setup/src/configs/int.ts
@@ -0,0 +1,22 @@
+///
+import { defineConfig } from 'vitest/config';
+import { baseTestConfig } from './base.js';
+
+export const intTestConfig = defineConfig({
+ ...baseTestConfig,
+ test: {
+ ...baseTestConfig.test,
+ coverage: {
+ reporter: ['text', 'lcov'],
+ reportsDirectory: './coverage',
+ exclude: ['mocks/**', '**/types.ts'],
+ },
+ include: ['src/**/*.int.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
+ setupFiles: [
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ '../../testing/test-setup/src/lib/portal-client.mock.ts',
+ '../../testing/test-setup/src/lib/extend/path.matcher.ts',
+ ],
+ },
+});
diff --git a/testing/test-vitest-setup/src/configs/unit-no-fs-cwd.ts b/testing/test-vitest-setup/src/configs/unit-no-fs-cwd.ts
new file mode 100644
index 000000000..d390c7b5b
--- /dev/null
+++ b/testing/test-vitest-setup/src/configs/unit-no-fs-cwd.ts
@@ -0,0 +1,31 @@
+///
+import { defineConfig } from 'vitest/config';
+import { baseTestConfig } from './base.js';
+
+/**
+ * Unit test configuration that mocks fs but NOT process.cwd()
+ * Use this for utility packages that need to test real process.cwd() behavior
+ */
+export const unitTestConfigNoFsCwd = defineConfig({
+ ...baseTestConfig,
+ test: {
+ ...baseTestConfig.test,
+ coverage: {
+ reporter: ['text', 'lcov'],
+ reportsDirectory: './coverage',
+ exclude: ['mocks/**', '**/types.ts'],
+ },
+ include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
+ setupFiles: [
+ '../../testing/test-setup/src/lib/fs-memfs.setup-file.ts',
+ '../../testing/test-setup/src/lib/cliui.mock.ts',
+ '../../testing/test-setup/src/lib/git.mock.ts',
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ '../../testing/test-setup/src/lib/portal-client.mock.ts',
+ '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
+ '../../testing/test-setup/src/lib/extend/markdown-table.matcher.ts',
+ '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts',
+ ],
+ },
+});
diff --git a/testing/test-vitest-setup/src/configs/unit.ts b/testing/test-vitest-setup/src/configs/unit.ts
new file mode 100644
index 000000000..54b05c014
--- /dev/null
+++ b/testing/test-vitest-setup/src/configs/unit.ts
@@ -0,0 +1,27 @@
+///
+import { defineConfig } from 'vitest/config';
+import { baseTestConfig } from './base.js';
+
+export const unitTestConfig = defineConfig({
+ ...baseTestConfig,
+ test: {
+ ...baseTestConfig.test,
+ coverage: {
+ reporter: ['text', 'lcov'],
+ reportsDirectory: './coverage',
+ exclude: ['mocks/**', '**/types.ts'],
+ },
+ include: ['src/**/*.unit.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
+ setupFiles: [
+ '../../testing/test-setup/src/lib/fs-with-cwd.setup-file.ts',
+ '../../testing/test-setup/src/lib/cliui.mock.ts',
+ '../../testing/test-setup/src/lib/git.mock.ts',
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ '../../testing/test-setup/src/lib/portal-client.mock.ts',
+ '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
+ '../../testing/test-setup/src/lib/extend/markdown-table.matcher.ts',
+ '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts',
+ ],
+ },
+});
diff --git a/testing/test-vitest-setup/src/index.ts b/testing/test-vitest-setup/src/index.ts
new file mode 100644
index 000000000..79d585811
--- /dev/null
+++ b/testing/test-vitest-setup/src/index.ts
@@ -0,0 +1,7 @@
+export * from './configs/unit.js';
+export * from './configs/unit-no-fs-cwd.js';
+export * from './configs/int.js';
+export * from './configs/e2e.js';
+export * from './configs/base.js';
+export * from './utils/project-config.js';
+export * from './utils/tsconfig-path-aliases.js';
diff --git a/testing/test-vitest-setup/src/utils/project-config.ts b/testing/test-vitest-setup/src/utils/project-config.ts
new file mode 100644
index 000000000..67f34434f
--- /dev/null
+++ b/testing/test-vitest-setup/src/utils/project-config.ts
@@ -0,0 +1,132 @@
+import { tsconfigPathAliases } from './tsconfig-path-aliases.js';
+
+const UNIT_TEST_TIMEOUT = 5000;
+const INTEGRATION_TEST_TIMEOUT = 15_000;
+const E2E_TEST_TIMEOUT = 30_000;
+
+export const TYPE_TEST_CONFIG = {
+ include: [`src/**/*.{unit,type}.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}`],
+ typecheck: {
+ include: ['**/*.type.test.ts'],
+ },
+};
+
+export type SharedVitestConfigOptions = {
+ projectRoot: string;
+ workspaceRoot: string;
+};
+
+function getDefaultTestSettings(
+ testType: string,
+ defaultTimeout: number,
+ noFsCwd = false,
+) {
+ return {
+ enabled: true,
+ environment: 'node' as const,
+ include: [`src/**/*.${testType}.test.{js,mjs,cjs,ts,mts,cts,jsx,tsx}`],
+ exclude: [
+ 'mocks/**',
+ '**/types.ts',
+ '**/__snapshots__/**',
+ 'src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}',
+ 'src/**/index.ts',
+ ],
+ testTimeout: defaultTimeout,
+ setupFiles: [
+ noFsCwd
+ ? '../../testing/test-setup/src/lib/fs-memfs.setup-file.ts'
+ : '../../testing/test-setup/src/lib/fs-with-cwd.setup-file.ts',
+ '../../testing/test-setup/src/lib/cliui.mock.ts',
+ '../../testing/test-setup/src/lib/git.mock.ts',
+ '../../testing/test-setup/src/lib/console.mock.ts',
+ '../../testing/test-setup/src/lib/reset.mocks.ts',
+ '../../testing/test-setup/src/lib/portal-client.mock.ts',
+ '../../testing/test-setup/src/lib/extend/ui-logger.matcher.ts',
+ '../../testing/test-setup/src/lib/extend/markdown-table.matcher.ts',
+ '../../testing/test-setup/src/lib/extend/jest-extended.matcher.ts',
+ ],
+ };
+}
+
+function getProjectPaths(
+ projectRoot: string,
+ workspaceRoot: string,
+ testType: string,
+) {
+ const pathSeparator = projectRoot.includes('/') ? '/' : '\\';
+ const pathParts = projectRoot.split(pathSeparator);
+ const PROJECT_NAME_PARTS = 2;
+ const projectName = pathParts.slice(-PROJECT_NAME_PARTS).join('-');
+ const coverageDir = `${workspaceRoot}/coverage/${projectName}/${testType}`;
+ const cacheDir = `${workspaceRoot}/node_modules/.vite/${projectName}`;
+
+ return { projectName, coverageDir, cacheDir };
+}
+
+function createSharedVitestConfig(
+ options: SharedVitestConfigOptions,
+ testType: 'unit' | 'integration' | 'e2e',
+ defaultTimeout: number,
+ noFsCwd = false,
+) {
+ const { projectRoot, workspaceRoot } = options;
+ const settings = getDefaultTestSettings(testType, defaultTimeout, noFsCwd);
+ const paths = getProjectPaths(projectRoot, workspaceRoot, testType);
+
+ return {
+ root: projectRoot,
+ test: {
+ coverage: {
+ enabled: settings.enabled,
+ provider: 'v8' as const,
+ reporter: ['text', 'lcov'],
+ reportsDirectory: paths.coverageDir,
+ include: ['src/**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
+ exclude: settings.exclude,
+ },
+ watch: false,
+ globals: true,
+ environment: settings.environment,
+ include: settings.include,
+ reporters: ['basic'],
+ passWithNoTests: true,
+ testTimeout: settings.testTimeout,
+ alias: tsconfigPathAliases(),
+ setupFiles: settings.setupFiles,
+ cache: {
+ dir: `${workspaceRoot}/node_modules/.vitest`,
+ },
+ pool: 'threads' as const,
+ poolOptions: {
+ threads: {
+ singleThread: true,
+ },
+ },
+ globalSetup: [`${workspaceRoot}/global-setup.ts`],
+ },
+ };
+}
+
+export function createSharedUnitVitestConfig(
+ options: SharedVitestConfigOptions,
+ noFsCwd = false,
+) {
+ return createSharedVitestConfig(options, 'unit', UNIT_TEST_TIMEOUT, noFsCwd);
+}
+
+export function createSharedIntegrationVitestConfig(
+ options: SharedVitestConfigOptions,
+) {
+ return createSharedVitestConfig(
+ options,
+ 'integration',
+ INTEGRATION_TEST_TIMEOUT,
+ );
+}
+
+export function createSharedE2eVitestConfig(
+ options: SharedVitestConfigOptions,
+) {
+ return createSharedVitestConfig(options, 'e2e', E2E_TEST_TIMEOUT);
+}
diff --git a/tools/vitest-tsconfig-path-aliases.ts b/testing/test-vitest-setup/src/utils/tsconfig-path-aliases.ts
similarity index 86%
rename from tools/vitest-tsconfig-path-aliases.ts
rename to testing/test-vitest-setup/src/utils/tsconfig-path-aliases.ts
index ac8be04df..cb364b8f4 100644
--- a/tools/vitest-tsconfig-path-aliases.ts
+++ b/testing/test-vitest-setup/src/utils/tsconfig-path-aliases.ts
@@ -14,7 +14,8 @@ export function tsconfigPathAliases(): AliasOptions {
.map(
([importPath, relativePath]): Alias => ({
find: importPath,
- replacement: new URL(`../${relativePath}`, import.meta.url).pathname,
+ replacement: new URL(`../../../../${relativePath}`, import.meta.url)
+ .pathname,
}),
);
}
diff --git a/testing/test-vitest-setup/tsconfig.json b/testing/test-vitest-setup/tsconfig.json
new file mode 100644
index 000000000..6655c1b42
--- /dev/null
+++ b/testing/test-vitest-setup/tsconfig.json
@@ -0,0 +1,23 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "module": "ESNext",
+ "target": "ES2022",
+ "lib": ["ES2022"],
+ "moduleResolution": "bundler",
+ "allowSyntheticDefaultImports": true,
+ "esModuleInterop": true,
+ "experimentalDecorators": true,
+ "emitDecoratorMetadata": true,
+ "importHelpers": true,
+ "skipLibCheck": true,
+ "skipDefaultLibCheck": true,
+ "strict": true,
+ "noImplicitOverride": true,
+ "noPropertyAccessFromIndexSignature": true,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": true
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "tmp"]
+}
diff --git a/testing/test-vitest-setup/tsconfig.lib.json b/testing/test-vitest-setup/tsconfig.lib.json
new file mode 100644
index 000000000..78eb742a0
--- /dev/null
+++ b/testing/test-vitest-setup/tsconfig.lib.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../dist/out-tsc"
+ },
+ "include": ["src/**/*"],
+ "exclude": ["**/*.spec.ts", "**/*.test.ts"]
+}
diff --git a/tsconfig.base.json b/tsconfig.base.json
index b183db5a3..5a0590b27 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -37,6 +37,9 @@
"@code-pushup/test-nx-utils": ["testing/test-nx-utils/src/index.ts"],
"@code-pushup/test-setup": ["testing/test-setup/src/index.ts"],
"@code-pushup/test-utils": ["testing/test-utils/src/index.ts"],
+ "@code-pushup/test-vitest-setup": [
+ "testing/test-vitest-setup/src/index.ts"
+ ],
"@code-pushup/typescript-plugin": [
"packages/plugin-typescript/src/index.ts"
],