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: []
};