// jest.config.js const baseModuleNameMapper = { '^@components$': '/src/components/index', '^@components/(.*)$': '/src/components/$1', '^@database/(.*)$': '/src/database/$1', '^@hooks$': '/src/hooks/index', '^@hooks/(.*)$': '/src/hooks/$1', '^@screens/(.*)$': '/src/screens/$1', '^@i18n/(.*)$': '/src/i18n/$1', '^@theme/(.*)$': '/src/theme/$1', '^@utils/(.*)$': '/src/utils/$1', '^@plugins/(.*)$': '/src/plugins/$1', '^@services/(.*)$': '/src/services/$1', '^@navigators/(.*)$': '/src/navigators/$1', '^@native/(.*)$': '/src/native/$1', '^@api/(.*)$': '/src/api/$1', '^@type/(.*)$': '/src/type/$1', '^@specs/(.*)$': '/specs/$1', '^@modules/nitro-epub$': '/modules/nitro-epub/src/index', '^@modules/nitro-tts$': '/modules/nitro-tts/src/index', '^@modules/(.*)$': '/modules/$1', '^@test-utils$': '/test/test-utils', '^@env$': '/src/generated/build-info', // Mock static assets '\\.(jpg|jpeg|png|gif|webp|svg)$': '/test/mocks/fileMock.js', }; const baseTransform = { '^.+\\.(js|jsx|ts|tsx)$': 'babel-jest', }; const baseTransformIgnorePatterns = [ // 'node_modules/(?!(.pnpm/|@op-engineering|drizzle-orm|lodash-es|@babel/runtime))', 'node_modules/(?!(?:.pnpm/)?((jest-)?react-native|@react-native(-community)?|expo(nent)?|@expo(nent)?/.*|@expo-google-fonts/.*|@material/material-color-utilities|@pchmn/expo-material3-theme|react-navigation|@react-navigation/.*|@sentry/react-native|native-base|react-native-svg|color|@op-engineering|drizzle-orm|lodash-es))', ]; module.exports = { moduleDirectories: ['node_modules'], projects: [ // --- Project 1: Database / pure logic tests (node environment) --- { displayName: 'db', testEnvironment: 'node', roots: ['/src/database'], testMatch: ['**/__tests__/**/*.test.ts'], moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], transform: baseTransform, transformIgnorePatterns: baseTransformIgnorePatterns, moduleNameMapper: baseModuleNameMapper, setupFilesAfterEnv: ['/src/database/queries/__tests__/setup.ts'], collectCoverageFrom: [ 'src/database/queries/**/*.ts', '!src/database/queries/**/__tests__/**', ], }, // --- Project 2: React Native component / hook / integration tests --- { displayName: 'rn', preset: 'jest-expo', roots: ['/src'], testMatch: [ '**/__tests__/**/*.test.tsx', // Also pick up non-db .test.ts (hooks, utils, services) '**/__tests__/**/*.test.ts', ], testPathIgnorePatterns: ['/node_modules/', '/src/database/'], moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], transform: baseTransform, transformIgnorePatterns: baseTransformIgnorePatterns, moduleNameMapper: baseModuleNameMapper, setupFiles: ['/test/mocks/index.js'], setupFilesAfterEnv: ['/test/setup/jest.ts'], collectCoverageFrom: [ 'src/**/*.{ts,tsx}', '!src/database/queries/**/__tests__/**', '!src/**/__tests__/**', ], }, ], // Global settings coverageDirectory: 'coverage', coverageReporters: ['text', 'lcov', 'html'], testTimeout: 10000, clearMocks: true, restoreMocks: true, verbose: true, };