{"version":3,"file":"test-discovery.cjs","sources":["../../../src/run-assertions/test-discovery.js"],"sourcesContent":["import path from 'path';\nimport fs from 'fs/promises';\nimport isEmptyDir from 'is-empty-dir';\nimport * as colors from 'colors/safe';\n\nconst SUPPORTED_PATTERNS = {\n  '**/*.test.js': /\\.test\\.js$/,\n  '**/*.spec.js': /\\.spec\\.js$/,\n  '**/*.test.ts': /\\.test\\.ts$/,\n  '**/*.spec.ts': /\\.spec\\.ts$/,\n};\n\nconst DEFAULT_IGNORED_DIRS = new Set(['node_modules', '.git', '.next', 'dist', 'build']);\n\nfunction compilePatterns(testMatch) {\n  const compiled = [];\n\n  for (const pattern of testMatch) {\n    const regex = SUPPORTED_PATTERNS[pattern];\n    if (!regex) {\n      console.error(colors.red(`\\n❌ Unsupported test pattern: ${pattern}`));\n      console.log(colors.gray('\\nSupported patterns:'));\n      for (const key of Object.keys(SUPPORTED_PATTERNS)) {\n        console.log(colors.gray(`  - ${key}`));\n      }\n      process.exit(1);\n    }\n    compiled.push(regex);\n  }\n\n  return compiled;\n}\n\n/**\n * @param {Object} options\n * @param {string} options.targetDir\n * @param {string[]} options.testMatch\n * @param {string[]} [options.ignoreDirs]\n * @returns {Promise<string[]>}\n */\nexport async function findTestFiles({ targetDir, testMatch, ignoreDirs = [] }) {\n  const isDirEmpty = await isEmptyDir(targetDir, { ignore: [/^\\./, 'node_modules'] });\n  if (isDirEmpty) {\n    console.error(colors.red(`\\n❌ No test files found in directory: ${targetDir}`));\n    process.exit(1);\n  }\n\n  const ignored = new Set([...DEFAULT_IGNORED_DIRS, ...ignoreDirs]);\n  const compiledPatterns = compilePatterns(testMatch);\n\n  const testFiles = [];\n  const seenDirs = new Set();\n  const dirQueue = [path.resolve(targetDir)];\n\n  while (dirQueue.length > 0) {\n    const currentDir = dirQueue.pop();\n\n    if (seenDirs.has(currentDir)) continue;\n    seenDirs.add(currentDir);\n\n    let entries;\n    try {\n      entries = await fs.readdir(currentDir, { withFileTypes: true });\n    } catch {\n      continue; // Skip unreadable directory\n    }\n\n    const subDirs = [];\n\n    await Promise.all(entries.map(async (entry) => {\n      const name = entry.name;\n\n      // Skip ignored dirs and dot-directories\n      if (entry.isDirectory()) {\n        if (name.startsWith('.') || ignored.has(name)) return;\n        subDirs.push(path.join(currentDir, name));\n        return;\n      }\n\n      // Files only\n      if (entry.isFile()) {\n        const absPath = path.join(currentDir, name);\n        const relativePath = path.relative(process.cwd(), absPath).replace(/\\\\/g, '/');\n\n        for (const regex of compiledPatterns) {\n          if (regex.test(relativePath)) {\n            testFiles.push(absPath);\n            break;\n          }\n        }\n      }\n    }));\n\n    dirQueue.push(...subDirs);\n  }\n\n  if (testFiles.length === 0) {\n    console.error(colors.red(`\\n❌ No test files matching the allowed patterns were found in: ${targetDir}`));\n    process.exit(1);\n  }\n\n  return testFiles;\n}\n"],"names":["colors.red","colors.gray"],"mappings":"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"}