import os from 'os'; import v8 from 'v8'; import type { InitialOptionsTsJest } from 'ts-jest/dist/types'; const ci = !!process.env.CI; type JestConfig = InitialOptionsTsJest & { // https://github.com/renovatebot/renovate/issues/17034 workerIdleMemoryLimit?: string; }; const cpus = os.cpus(); const mem = os.totalmem(); const stats = v8.getHeapStatistics(); process.stderr.write(`Host stats: Cpus: ${cpus.length} Memory: ${(mem / 1024 / 1024 / 1024).toFixed(2)} GB HeapLimit: ${(stats.heap_size_limit / 1024 / 1024 / 1024).toFixed(2)} GB `); /** * https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources * Currently it seems the runner only have 4GB */ function jestGithubRunnerSpecs(): JestConfig { // if (os.platform() === 'darwin') { // return { // maxWorkers: 2, // workerIdleMemoryLimit: '4GB', // }; // } return { maxWorkers: cpus.length, workerIdleMemoryLimit: '1500MB', // '2GB', }; } const config: JestConfig = { cacheDirectory: '.cache/jest', clearMocks: true, coverageDirectory: './coverage', collectCoverage: true, collectCoverageFrom: [ 'lib/**/*.{js,ts}', '!lib/**/*.{d,spec}.ts', '!lib/**/{__fixtures__,__mocks__,__testutil__,test}/**/*.{js,ts}', '!lib/**/types.ts', ], coverageReporters: ci ? ['html', 'json', 'text-summary'] : ['html', 'text-summary'], coverageThreshold: { global: { branches: 98, functions: 100, lines: 100, statements: 100, }, }, transform: { '\\.ts$': [ 'ts-jest', { tsconfig: '/tsconfig.spec.json', diagnostics: false, isolatedModules: true, }, ], }, modulePathIgnorePatterns: [ '/dist/', '/__fixtures__/', '/__mocks__/', ], reporters: ci ? ['default', 'github-actions'] : ['default'], setupFilesAfterEnv: [ 'jest-extended/all', 'expect-more-jest', '/test/setup.ts', '/test/to-migrate.ts', ], snapshotSerializers: ['/test/newline-snapshot-serializer.ts'], testEnvironment: 'node', testRunner: 'jest-circus/runner', watchPathIgnorePatterns: ['/.cache/', '/coverage/'], // We can play with that value later for best dev experience workerIdleMemoryLimit: '500MB', // add github runner specific limits ...(ci && jestGithubRunnerSpecs()), }; export default config;