# All files / lib/detectors stack-detector.js

100% Statements 15/15
71.42% Branches 5/7
100% Functions 3/3
100% Lines 14/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39

    1x

    4x

    4x
    19x
    16x
    4x
    4x
    4x

    4x
    1x

    3x
    1x
    1x

    3x
     import fs from 'fs-extra';
    import path from 'path';
    import { detectNodeStack } from './node-detector.js';
    import { detectPythonStack } from './python-detector.js';
    import { detectRustStack } from './rust-detector.js';
    import { detectSwiftStack } from './swift-detector.js';

    const DETECTORS = [
      { name: 'node', detector: detectNodeStack, files: ['package.json'] },
      { name: 'python', detector: detectPythonStack, files: ['requirements.txt', 'pyproject.toml'] },
      { name: 'rust', detector: detectRustStack, files: ['Cargo.toml'] },
      { name: 'swift', detector: detectSwiftStack, files: ['Podfile'] },
    ];

    export async function detectStack(cwd = process.cwd()) {
      const results = [];

      for (const { name, detector, files } of DETECTORS) {
        const hasIndicator = files.some(file => fs.pathExistsSync(path.join(cwd, file)));
        if (hasIndicator) {
          const result = await detector(cwd);
          Eif (result.detected) {
            results.push(result);
          }
        }
      }

      // Return highest confidence result
      if (results.length === 0) {
        return { detected: false };
      }

      results.sort((a, b) => {
        const confidenceOrder = { high: 3, medium: 2, low: 1 };
        return confidenceOrder[b.confidence] - confidenceOrder[a.confidence];
      });

      return results[0];
    }