const isCI = process.env.CI === 'true'; const isDebug = process.env.DEBUG === 'true'; const tsJestTransform = [ 'ts-jest', { tsconfig: { esModuleInterop: true, allowSyntheticDefaultImports: true, skipLibCheck: true, }, }, ]; const moduleNameMapper = { '^src/(.*)$': '/src/$1', '^@core/(.*)$': '/src/core/$1', '^@infrastructure/(.*)$': '/src/infrastructure/$1', '^@application/(.*)$': '/src/application/$1', '^@domain/(.*)$': '/src/domain/$1', '^@ui/(.*)$': '/src/ui/$1', '^@utils/(.*)$': '/src/utils/$1', '^@types/(.*)$': '/src/types/$1', '\\.(css|less|scss|sass)$': '/tests/mocks/styleMock.js', '\\.(jpg|jpeg|png|gif|svg|webp)$': '/tests/mocks/fileMock.js', '^obsidian$': '/tests/mocks/obsidian.mock.ts', }; const createProject = (overrides) => ({ preset: 'ts-jest', transform: { '^.+\\.(ts|tsx)$': tsJestTransform, }, moduleNameMapper, moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], ...overrides, }); module.exports = { cache: true, cacheDirectory: '/.jest-cache', maxWorkers: isCI ? 2 : '50%', verbose: true, reporters: [ 'default', ...(isCI ? [ [ 'jest-junit', { outputDirectory: './reports', outputName: 'junit.xml', }, ], ] : []), ], bail: isCI ? 1 : 0, errorOnDeprecated: true, workerIdleMemoryLimit: '512MB', onlyChanged: false, logHeapUsage: isDebug, detectOpenHandles: isDebug, detectLeaks: isDebug, collectCoverage: isCI, coverageProvider: 'v8', collectCoverageFrom: [ 'src/**/*.{ts,tsx}', '!src/**/*.d.ts', '!src/types/**', '!src/main.ts', '!src/**/*.test.ts', '!src/**/*.spec.ts', ], coverageDirectory: 'coverage', coverageReporters: ['text', 'lcov', 'html', 'json-summary'], projects: [ createProject({ displayName: 'Unit Tests', testEnvironment: 'node', testMatch: ['/tests/unit/**/*.test.ts'], setupFilesAfterEnv: ['/tests/helpers/testSetup.js'], coverageThreshold: { global: { branches: 50, functions: 25, lines: 10, statements: 10, }, }, }), createProject({ displayName: 'Integration Tests', testEnvironment: 'node', testMatch: ['/tests/integration/**/*.test.ts'], setupFilesAfterEnv: ['/tests/helpers/testSetup.js'], coverageThreshold: { global: { branches: 50, functions: 25, lines: 3, statements: 3, }, }, }), createProject({ displayName: 'E2E Tests', testEnvironment: 'jsdom', testMatch: ['/tests/e2e/**/*.e2e.test.ts'], setupFilesAfterEnv: ['/tests/helpers/e2e.setup.ts'], maxWorkers: 1, coverageThreshold: { global: { branches: 50, functions: 25, lines: 3, statements: 3, }, }, }), ], };