jest.config.cjs5.6 KBView on GitHub /** @type {import('jest').Config} */
// import.meta.env babel plugin lives in a sibling file so babel-jest can
// reference it by string path. An inline function plugin breaks
// `loadPartialConfigSync`'s cache-key computation (".plugins[0] must be a
// string, object, function" comes from there) because the function isn't
// stable across worker boundaries.
const importMetaPluginPath = require.resolve('./babel-plugin-import-meta.cjs');
module.exports = {
testEnvironment: 'jsdom',
roots: [
'<rootDir>/modules/cedar-os/__tests__',
'<rootDir>/modules/drafting/components/__tests__',
'<rootDir>/modules/drafting/store/__tests__',
'<rootDir>/modules/documents/yjs/__tests__',
'<rootDir>/modules/threads/threadList/store/__tests__',
'<rootDir>/modules/outbound',
'<rootDir>/modules/roadmap',
'<rootDir>/modules/conversations/components/strategicOverview',
'<rootDir>/modules/conversations/components/timeline',
'<rootDir>/modules/conversations/components/files/__tests__',
'<rootDir>/modules/brain/components',
'<rootDir>/modules/company/__tests__',
'<rootDir>/modules/agents',
'<rootDir>/modules/aop',
'<rootDir>/modules/home',
'<rootDir>/modules/integrations',
'<rootDir>/modules/sharing',
'<rootDir>/tests',
],
testMatch: [
'**/modules/cedar-os/__tests__/**/*.test.ts',
'**/modules/cedar-os/__tests__/**/*.test.tsx',
'**/modules/drafting/components/__tests__/**/*.test.ts',
'**/modules/drafting/components/__tests__/**/*.test.tsx',
'**/modules/drafting/store/__tests__/**/*.test.ts',
'**/modules/drafting/store/__tests__/**/*.test.tsx',
'**/modules/documents/yjs/__tests__/**/*.test.ts',
'**/modules/threads/threadList/store/__tests__/**/*.test.ts',
'**/modules/threads/threadList/store/__tests__/**/*.test.tsx',
'**/modules/outbound/**/__tests__/**/*.test.ts',
'**/modules/outbound/**/__tests__/**/*.test.tsx',
'**/modules/roadmap/**/__tests__/**/*.test.ts',
'**/modules/roadmap/**/__tests__/**/*.test.tsx',
'**/modules/agents/**/__tests__/**/*.test.ts',
'**/modules/agents/**/__tests__/**/*.test.tsx',
'**/modules/aop/**/__tests__/**/*.test.ts',
'**/modules/aop/**/__tests__/**/*.test.tsx',
'**/modules/home/**/__tests__/**/*.test.ts',
'**/modules/home/**/__tests__/**/*.test.tsx',
'**/modules/integrations/**/__tests__/**/*.test.ts',
'**/modules/integrations/**/__tests__/**/*.test.tsx',
'**/modules/conversations/components/strategicOverview/**/*.test.tsx',
'**/modules/conversations/components/timeline/**/*.test.tsx',
'**/modules/conversations/components/files/__tests__/**/*.test.ts',
'**/modules/conversations/components/files/__tests__/**/*.test.tsx',
'**/modules/brain/components/**/*.test.tsx',
'**/modules/company/__tests__/**/*.test.ts',
'**/modules/company/__tests__/**/*.test.tsx',
'**/modules/integrations/**/__tests__/**/*.test.ts',
'**/modules/integrations/**/__tests__/**/*.test.tsx',
'**/modules/sharing/**/__tests__/**/*.test.ts',
'**/modules/sharing/**/__tests__/**/*.test.tsx',
'**/tests/**/*.test.ts',
'**/tests/**/*.test.tsx'
],
transform: {
'^.+\\.(ts|tsx|js|mjs|cjs)$': ['babel-jest', {
presets: [
['@babel/preset-env', { targets: { node: 'current' } }],
'@babel/preset-typescript',
['@babel/preset-react', { runtime: 'automatic' }]
],
plugins: [importMetaPluginPath],
}]
},
resolver: '<rootDir>/jest.resolver.cjs',
moduleNameMapper: {
// Specific mocks must come BEFORE the general ^@/ catch-all
// Mock tRPC client (imports superjson + runtime-urls — both break in jest env)
'^@/modules/trpc/trpc$': '<rootDir>/modules/cedar-os/__tests__/__mocks__/trpc.ts',
// Mock query-provider (imports auth-client which uses new Request() at load time)
'^@/providers/query-provider$': '<rootDir>/modules/cedar-os/__tests__/__mocks__/query-provider.ts',
// Mock auth-client (uses new Request() at module init time — not available in jsdom)
'^@/modules/auth/utils/auth-client$': '<rootDir>/modules/cedar-os/__tests__/__mocks__/auth-client.ts',
// @/* is handled by jest.resolver.cjs (mirrors tsconfig multi-path alias)
// Map lodash-es (ESM) to lodash (CJS) for jest compatibility
'^lodash-es$': 'lodash',
'^lodash-es/(.*)$': 'lodash/$1',
// novel is ESM-only; its package.json CJS fallback points at an absent guard file.
'^novel$': '<rootDir>/node_modules/novel/dist/index.js',
// Handle CSS imports
'\\.(css|less|scss|sass)$': 'identity-obj-proxy'
},
setupFilesAfterEnv: ['<rootDir>/jest.setup.js'],
watchman: false,
// `tests/timezone/` runs in its own pass, under a non-UTC TZ — see jest.tz.config.cjs.
// Excluded here because in UTC those tests pass no matter what the code does, which is
// exactly how the bug they cover reached users.
testPathIgnorePatterns: ['/node_modules/', '/dist/', '<rootDir>/tests/timezone/'],
watchPathIgnorePatterns: ['/node_modules/', '/.next/', '/dist/', '/coverage/', '/build/'],
modulePathIgnorePatterns: ['<rootDir>/node_modules/'],
collectCoverageFrom: [
'modules/cedar-os/src/**/*.{ts,tsx}',
'!modules/cedar-os/src/**/*.d.ts',
'!modules/cedar-os/src/**/*.test.{ts,tsx}'
],
coverageReporters: ['text', 'text-summary', 'lcov'],
coverageDirectory: 'coverage',
// Transform everything — the entire node_modules tree is fair game for babel-jest.
// Needed because this pnpm monorepo pulls in many ESM-only packages (lucide-react,
// lodash-es, superjson, …) that the default ignore pattern would leave untransformed.
transformIgnorePatterns: []
};